5

我有一个名为 URLlist 的 URL 列表,我遍历它以获取每个 URL 的源代码:

for (k in 1:length(URLlist)){
    temp = getURL(URLlist[k])
}

问题是一些随机 URL,代码卡住了,我收到错误消息:

Error in function (type, msg, asError = TRUE)  : 
    transfer closed with outstanding read data remaining

但是,当我尝试使用有问题的 URL 而不是在循环中的 getURL 函数时,它完美地工作。

请问有什么帮助吗?非常感谢您

4

1 回答 1

3

如果没有更多信息,很难确定,但这可能只是请求发送得太快,在这种情况下,在请求之间暂停可能会有所帮助:

for (k in 1:length (URLlist)) {
    temp = getURL (URLlist[k])
    Sys.sleep (0.2) 
}

我假设您的实际代码在循环的每次迭代中重写它之前对“temp”做了一些事情,并且无论它做什么都非常快。

您还可以尝试构建一些错误处理,这样一个问题就不会杀死整个事情。这是一个粗略的示例,它在放弃之前在每个 URL 上尝试两次:

for (url in URLlist) {
    temp = try (getURL (url))
    if (class (temp) == "try-error") {
        temp = try (getURL (url))
        if (class (temp) == "try-error")
            temp = paste ("error accessing", url)
        }    
    Sys.sleep(0.2) 
}
于 2013-06-04T02:49:57.367 回答