我非常强烈地使用 TTR 包中的getYahooData()
功能。
我有这段代码:
for(i in 1:nrow(symbol)){
tryCatch(prices <- getYahooData(symbol$symbol[i], from, to, freq="daily",
type="price"),
warning=function(e) continue <- 0)
if (continue==0) next
}
此循环很长我收到此错误:
文件错误(文件,“rt”):所有连接都在使用中调用:tryCatch ... doTryCatch - &gt; getYahooData - &gt; getYahooData - &gt; read.table - &gt;文件 执行暂停
我该怎么办?
更新
如果我使用closeAllConnections(),我得到:
I get: *** caught segfault *** address (nil), cause 'memory not mapped' Traceback: 1: getConnection(set[i]) 2: close(getConnection(set[i])) 3: closeAllConnections() aborting ...
答案 0 :(得分:15)
第一:永远不要在你的生活中使用那种继续建构。这是没用的。如果您为错误或警告定义了处理程序,tryCatch()
将继续。它将使用那个而不是“默认”error=function(e) stop(e)
。这个将停止你的功能。如果您定义了处理程序(warning=
或error=
),则不会停止您的脚本,因此不需要继续。
这说:在这种情况下正确使用tryCatch将是:
for(i in 1:nrow(symbol)){
tryCatch(prices <- getYahooData(symbol$symbol[i], from, to, freq="daily",
type="price"), error = function(e){})
}
或者,如果您在脚本中使用它并希望在发生错误时转到下一个循环,则可以使用:
for(i in 1:nrow(symbol)){
prices <- try(getYahooData(symbol$symbol[i], from, to, freq="daily",
type="price"), silent=TRUE)
if(inherits(prices,"try-error")) { next } # only true if an error occurs
... # rest of calculations
}
如果您使用过tryCatch这种方式或尝试过,那么您就不会遇到此处报告的问题。
现在我可以重现你的情况,如果我使用不存在的符号。您错误地使用tryCatch()
函数会给您带来麻烦。 read.table
会返回错误(Error in file(file, "rt") : cannot open the connection
)。这是错误,而不是警告。您会收到另一个警告,指出未找到404文件。
当警告与错误一起发出时,首先处理警告的处理函数。那是因为在停止函数之前必须抛出警告。所以它不会处理你得到的错误,这意味着由于错误没有处理,注册时出现问题连接。由于无法打开连接,on.exit(close(file))
中的read.table()
将不会被调用。因此,连接没有正确关闭并且仍然被认为是开放的,虽然R不再能找到它(showAllConnections()没有显示任何内容。)on.exit(close(...))
将无效。 showConnections()
没有显示连接,但不知何故R仍然认为它在那里。因此,所有的地狱都会破裂而你会崩溃。
感谢@Tommy
的更正一个简单的代码示例来说明这一点:
myfun <- function(x){
if(x>1) warning("aWarning")
stop("aStop")
x
}
tryCatch(myfun(0.5),
warning=function(w)print("warning"),
error=function(e) print("stop"))
[1] "stop"
tryCatch(myfun(1.5),
warning=function(w)print("warning"),
error=function(e) print("stop"))
[1] "warning"
总结:
作为额外的:你的循环只返回最后一次调用的结果,因为你每次循环都会覆盖prices
,以防你使用正确的符号。
编辑:如果您想继续操作
答案 1 :(得分:10)
关闭一些连接?可以像在循环体的末尾插入closeAllConnections()
一样简单。
答案 2 :(得分:8)
这确实是R源代码中有关如何注册连接的错误。我在R Bugzilla网站上发布了一些评论和补丁:http://bugs.r-project.org/bugzilla3/show_bug.cgi?id=14660。 Joris的建议是合理的。但是,当修复错误时,closeAllConnections()也将起作用。 (P.S.这是我的第一篇StackOverflow帖子。如果我违反了礼仪,请原谅我。)
答案 3 :(得分:0)
在我过去挖掘的某个地方,有人提到在read.table.url()或url()等函数中使用URL引用会调用一个有点错误的本机R HTTP连接器。事实证明,在错误时关闭连接更有效的方法是在read.table()或等效的函数调用中显式调用RCurl。例如,当累积大量HTTP错误时,这给我带来了问题:
result <- try ( DF <- read.table(con <- url(url), col.names=colNames),
silent=TRUE )
我已经看到RCurl变体的好结果,调用它的getURL函数:
result <- try ( DF <- read.table(textConnection(getURL(url)), col.names=colNames),
silent=TRUE )
这是在运行R v2.15.3。