2014-01-29 2 views
2

Я запускаю программу оптимизации, которую я написал в многоязычной структуре. Поскольку для выполнения задачи я полагаюсь на разные языки, все должно быть автономным, поэтому его можно запустить через пакетный файл. Все прошло отлично в течение 2-3 месяцев, но мне, наконец, не повезло, когда одна из важнейших частей этого процесса, выполненная с помощью автономного сценария R, столкнулась с чем-то новым и дала мне сообщение об ошибке. Это сообщение об ошибке делает все визжать к остановке, несмотря на все мои усилия:Как избежать остановки выполнения отдельного r-скрипта, который встречает ошибку?

selMEM<-forward.sel(muskfreq, musk.MEM, adjR2thresh=adjR2) 
    Procedure stopped (adjR2thresh criteria) adjR2cum = 0.000000 with 0 variables (superior to -0.005810) 
    Error in forward.sel(muskfreq, musk.MEM, adjR2thresh = adjR2) : 
    No variables selected. Please change your parameters. 

Я знаю, почему я получаю это сообщение: он предупреждает меня, что переменные не выше порога я запрограммирован, чтобы сохранить во время прямого выбора , Хотя этого не происходило в сотнях запусков, это не такая уж большая сделка, мне просто нужно сказать R, что делать дальше. Здесь я потерялся. После исчерпывающего поиска по нескольким сообщениям (such as here), это швы, которые пытаются() и tryCatch() - это путь. Так что я попытался следующее:

selMEM<-try(forward.sel(muskfreq, musk.MEM, adjR2thresh=adjR2)) 

    if(inherits(selMEM, "try-error")) { 
     max<-0 
     cumR2<-0 
     adjR2<-0 
     pvalue<-NA 
    } else { 
     max<-dim(selMEM)[1] 
     cumR2<-selMEM$R2Cum[max] 
     adjR2<-selMEM$AdjR2Cum[max] 
     pvalue<-selMEM$pval[max] 
    } 

Код после проблемной линии отлично работает, если я исполню ее построчно в R, но когда я исполняю его как отдельный сценарий из командной строки, я все еще получаю то же сообщение об ошибке, и весь мой процесс застывает до того, как он выполнит следующее.

Любые предложения о том, как сделать эту работу?

ответ

3

ПримечаниеЭтот в try помощи:

try осуществляется с использованием tryCatch; для программирования, а не try(expr, silent = TRUE), что-то вроде tryCatch(expr, error = function(e) e) (или других простых функций обработчика ошибок) может быть более эффективным и гибким.

Посмотрите на tryCatch, возможно:

selMEM <- tryCatch({ 
    forward.sel(muskfreq, musk.MEM, adjR2thresh=adjR2) 
}, error = function(e) { 
    message(e) 
    return(NULL) 
}) 

if(is.null(selMEM)) { 
    max<-0 
    cumR2<-0 
    adjR2<-0 
    pvalue<-NA 
} else { 
    max<-dim(selMEM)[1] 
    cumR2<-selMEM$R2Cum[max] 
    adjR2<-selMEM$AdjR2Cum[max] 
    pvalue<-selMEM$pval[max] 
} 
+0

Спасибо за этот ответ, это, безусловно, представляется более перспективным, чем то, что я начал с. Тем не менее, у меня такая же проблема, как и раньше ... скрипт прекрасно работает во всех сценариях, которые я бросаю на него, если я выполняю его по строкам в консоли R (несмотря на сообщения об ошибках), но в автономном скрипте он дает me: 'Ошибка в tryCatchOne (expr, names, parentenv, обработчики [[1L]]): попытка применить нефункции' и' Execution halted' –

+0

А, я виноват. Я считаю, что 'error' требует функции. Я сделал редактирование - попробуйте это. –

+0

Yup, я просто обманывал и в итоге придумал почти то же самое, я отредактировал сценарий выше, чтобы показать окончательные настройки, которые заставили все работать. Спасибо, куча, ваш вклад был бесценным! –

0

Вы пытались установить параметр молчания в true в функции Try?

max<-0 
cumR2<-0 
adjR2<-0 
pvalue<-NA 

try({ 
    selMEM <- forward.sel(muskfreq, musk.MEM, adjR2thresh=adjR2) 
    max<-dim(selMEM)[1] 
    cumR2<-selMEM$R2Cum[max] 
    adjR2<-selMEM$AdjR2Cum[max] 
    pvalue<-selMEM$pval[max] 
}, silent=T) 
Смежные вопросы