Функция try() в R не отлавливает ошибки, вызванные функцией file.remove().

Я пытаюсь поймать ошибку, выдаваемую file.remove(), когда, например, файл Excel открыт и поэтому не может быть удален. Кажется, что функция R try() в этом случае не работает. Следующий код по-прежнему выводит ошибку на консоль, хотя для аргумента silent задано значение TRUE и в переменной ничего не сохраняется:

removal.error <- try(file.remove("testfile.xlsx"), silent = T)

remove.error [1] ЛОЖЬ

Любые предложения, почему это так, или обходные пути, чтобы поймать такую ​​​​ошибку?


person user116    schedule 10.11.2016    source источник
comment
А как насчет tryCatch? Вы можете вернуть сообщение в случае ошибки или предупреждения и т. д.   -  person drmariod    schedule 10.11.2016
comment
Пожалуйста, прочтите справку для file.remove и загляните в раздел «Значение». ASFAICS и file.remove, и try работают так, как ожидалось и описано.   -  person Bhas    schedule 10.11.2016


Ответы (1)


Ни функции try, ни tryCatch не обнаруживают никаких ошибок, потому что функция remove.file работает правильно (как сказал @Bhas) и выдает значение FALSE, которое можно использовать для обработки ошибки, как показано ниже:

write.csv2(x = data.frame(V1 = 1:10, V2 = letters[1:10]),
           file = 'file.csv')

shell('start excel file.csv') # opens excel to throw the error

rem <- try(file.remove('file.csv'))
rem # [1] FALSE

if (rem == FALSE) {
  shell('taskkill /F /IM excel.exe') # handle the error you pointed us
  rem_2 <- file.remove('file.csv')
  if(rem_2 == FALSE) { # if this was not the case, warn the user
    warning(warnings())
    class(rem) <- c(class(rem), "try-error") # and add try-error class to 'rem'
  }
}

После этого вы сможете справиться с этим, как и планировали.

OBS: запустите этот код построчно, иначе R будет быстрее, чем excel, и вы не увидите никаких ошибок в консоли.

person Tomás Barcellos    schedule 12.11.2016