我在 R 中遇到了一个奇怪的问题。
考虑以下代码(真实代码的真正简化版本,但仍然存在问题):
library(timeSeries)
tryCatch(
{
specificWeekDay <- 2
currTs <- timeSeries(c(1,2),c('2012-01-01','2012-01-02'),
format='%Y-%m-%d',units='A')
# just 2 dates out of range
start <- time(currTs)[2]+100*24*3600
end <- time(currTs)[2]+110*24*3600
# this line returns an empty timeSeries
currTs <- window(currTs,start=start,end=end)
message("Up to now, everything is OK")
# this is the line with the uncatchable error
currTs[!(as.POSIXlt(time(currTs))$wday %in% specificWeekDay),] <- NA
message("I'm after the bugged line !")
},error=function(e){message(e)})
message("End")
当我在 RGui 中运行该代码时,我正确地得到以下输出:
到目前为止,
在为函数 '[<-' 选择方法时评估参数 'i' 时一切正常:as.POSIXlt.numeric(time(currTs)) 中的错误:必须提供'origin'
End
相反,当我使用以下行通过 RScript(在 Windows 中)运行它时:
RScript.exe --vanilla "myscript.R"
我得到这个输出:
截至目前,一切正常
执行中断
好像 RScript 崩溃了……
关于原因的任何想法?
这是一个 timeSeries 包错误,还是我做错了什么?
如果是后者,确保捕获所有错误的正确方法是什么?
提前致谢。
编辑 :
这是一个较小的示例,它重现了不使用 timeSeries 包的问题。要对其进行测试,只需按上述方式运行它:
library(methods)
# define a generic function
setGeneric("foo",
function(x, ...){standardGeneric("foo")})
# set a method for the generic function
setMethod("foo", signature("character"),
function(x) {x})
tryCatch(
{
foo("abc")
foo(notExisting)
},error=function(e)print(e))
似乎与通用方法调度有关;当方法的参数导致错误时,调度程序无法找到该方法的签名,并随之引发tryCatch
函数在通过 RScript 运行时似乎无法处理的异常。
奇怪的是,它不会发生,例如print(notExisting)
; 在这种情况下,异常会得到正确处理。
关于原因以及如何捕捉这种错误的任何想法?
注意:
我在 Windows 7 上使用 R-2.14.2