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"
私はこの出力を得る:
ここまではOK
実行中断
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))
ジェネリック メソッドのディスパッチに関連しているようです。メソッドの引数によってエラーが発生した場合、ディスパッチャーはメソッドのシグネチャを見つけることができず、その結果、RScript をtryCatch
介して実行したときに関数が処理できないように見える例外を発生させます。
奇妙なことに、たとえばprint(notExisting)
;では起こりません。その場合、例外は正しく処理されます。
この種のエラーをキャッチする理由と方法について何か考えはありますか?
注:
Windows 7 で R-2.14.2 を使用しています。