не избегать/пропускать ошибки с помощью try и tryCatch

У меня есть nlsLM внутри for loop, потому что я хочу попробовать разные start values, чтобы соответствовать моим данным. Я уже знаю, что какой-то start values генерирует это error: singular gradient matrix at initial parameter estimates, но я хочу пропустить этот error и продолжить с loop, подгоняя регрессию к следующему start values. Я попытался поместить все for loop в блоки try и tryCatch, установив silence=TRUE, но код все еще останавливается, когда происходит singular gradient matrix at initial parameter estimates error.

Кто-нибудь может помочь мне с этим?

Вот код:

try({
    for (scp.loop in scp.matrix){
    for (fit.rate in 1:10){
         print(scp.loop)
         print(fit.rate)

         #fit model with nlsLM
         #blah, blah, blah
     }}
     },silent=FALSE)

person José Ricardo    schedule 12.03.2015    source источник
comment
Можете ли вы включить код, который вы использовали? Мы могли бы указать, где может быть проблема.   -  person Dominic Comtois    schedule 12.03.2015
comment
Конечно, @DominicComtois! Теперь у вас есть код. Я новичок в R и программировании, возможно, мой код грязный. Если у вас есть идея улучшить производительность и сделать ее чище, я ценю.   -  person José Ricardo    schedule 14.03.2015


Ответы (1)


Чтобы понять проблему, вам нужно понять, как работает try(). В частности, try будет запускать код с первым аргументом до тех пор, пока код не завершится сам по себе или пока не обнаружит ошибку. особенность, которую делает try(), заключается в том, что если в вашем коде есть ошибка, она поймает эту ошибку (без запуска остатка кода в своем первом аргументе) и (1) вернет эту ошибку и обычный объект R и (2) разрешить выполнение кода после оператора try(). Например:

x <- try({
    a = 1  # this line runs
    stop('arbitrary error') # raise an explicit error
    b = 2  # this line does not run
})
print('hello world') # this line runs despite the error

Обратите внимание, что в приведенном выше коде x является объектом класса try-error, тогда как в следующем коде он равен 2 (последнее значение блока):

x <- try({
    a = 1  # this line runs
    b = 2  # this line runs too
})

получение возврата позволяет проверить, была ли ошибка через inherits(x,'try-error').

Как это применимо к вам, так это то, что я почти уверен, что вы просто хотите включить блок, который выполняется в циклах for, в ваше состояние try(), как в:

for (scp.loop in scp.matrix)
    for (fit.rate in 1:10)
        try({ 
            print(scp.loop)
            print(fit.rate)

            blah, blah, blah, 

            else{coeff.poly.only.res<<-coef(polyfitted.total)}
        },silent=FALSE)
person Jthorpe    schedule 14.03.2015
comment
Спасибо, @Jthorpe! Это было лучшее объяснение, которое я читал. Теперь я понимаю, как работает try. Я применил ваши предложения, и теперь мой код работает отлично. - person José Ricardo; 14.03.2015