Как найти, что пошло не так во время eval в R?

Часть кода:

Rengine re = getRengine();
re.eval("library(quantmod)");
re.eval("library(PerformanceAnalytics)");
re.eval("library(tseries)");
re.eval("library(FinTS)");
re.eval("library(rugarch)");
re.eval("library(robustbase)");

re.assign("arLagNum", new double[]{1});
re.assign("maLagNum", new double[]{1});
re.assign("archLagNum", new double[]{1});
re.assign("garchLagNum", new double[]{1});

re.eval("garchSpec <- ugarchspec(variance.model = list(model=\"iGARCH\", garchOrder=c(archLagNum,garchLagNum)), mean.model = list(armaOrder=c(arLagNum,maLagNum)), distribution.model=\"std\")");

re.assign("transformedTsValueData", new double[]{getSomeDoubles()};
re.eval("estimates <- ugarchfit(spec = garchSpec, data = transformedTsValueData, solver.control = list(trace = 1))");
re.eval("estimates");

Последняя строка возвращает null. В документации API говорится: " метод eval возвращает null, если что-то пошло не так.". Как узнать, что пошло не так?

Ответ 1

Предоставлено это не самым элегантным, но вы можете попробовать получить некоторую информацию, если поместите свою команду в try catch:

re.eval("estimates <-tryCatch(suppressWarnings(ugarchfit(spec = garchSpec, data = transformedTsValueData, solver.control = list(trace = 1))), error = function(e) { paste(\"e: \",e$message) }, warning = function(w) { paste(\"w: \", w$message) })");

вы можете затем оценить ответ, проверив первые несколько символов. Если вы не хотите делать это для каждого вызова, вы можете повторить свою последнюю команду, если ваш ответ равен нулю, когда вы этого не ожидаете (и повторение чего-то, что пошло не так, обычно не занимает слишком много времени).

Изменить: Подумайте об этом, если ошибка возникает только тогда, когда вы оцениваете "оценки", может быть лучше обернуть последнее в try catch:

re.eval("tryCatch(suppressWarnings(estimates), error = function(e) { paste(\"e: \",e$message) }, warning = function(w) { paste(\"w: \", w$message) })");