gpt4 book ai didi

r - 如果通过 RScript 调用 tryCatch 不会捕获错误

转载 作者:行者123 更新时间:2023-12-03 21:26:03 25 4
gpt4 key购买 nike

我在 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 中运行该代码时,我正确地得到以下输出:

Up to now, everything is OK
error in evaluating the argument 'i' in selecting a method for function '[<-': Error in as.POSIXlt.numeric(time(currTs)) : 'origin' must be supplied
End



相反,当我使用以下行通过 RScript(在 Windows 中)运行它时:
RScript.exe --vanilla "myscript.R"

我得到这个输出:

Up to now, everything is OK
Execution interrupted



好像 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

最佳答案

问题在于实现 S4 方法分派(dispatch)的内部 C 代码 try catch 和处理一些错误的方式以及在这种方法中如何处理非交互式情况。应该很快在 R-devel 和 R-patched 中找到解决方法。

解决方法现在致力于 R-devel 和 R-patched。

关于r - 如果通过 RScript 调用 tryCatch 不会捕获错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11393510/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com