У меня возникла странная проблема в 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"
Конец
Вместо этого, когда я запускаю его через RScript (в окнах), используя следующую строку:
RScript.exe --vanilla "myscript.R"
Я получаю этот вывод:
До сих пор все в порядке
Выполнение прервано
Кажется, что сбой RScript...
Любая идея о причине?
Является ли это ошибкой пакета timeSeries, или я делаю что-то неправильно?
Если последний, какой правильный способ наверняка поймать все ошибки?
Спасибо заранее.
EDIT:
Ниже приведен пример, воспроизводящий проблему, которая не использует пакет 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)
; в этом случае исключение корректно обрабатывается.
Любая идея о причине и как поймать такие ошибки?
Примечание:
Я использую R-2.14.2 в Windows 7