Как реализовать tryCatch () для цикла for, используя R - PullRequest
0 голосов
/ 25 октября 2018

Я написал R-код, используя цикл for(), который считывает некоторые запросы, хранящиеся в столбце R таблицы Excel, попадает на сервер и сохраняет полученный ответ в текстовом файле.Код работает нормально, пока сервер не ответит с ошибкой, выполнение цикла останавливается.Я пытался реализовать tryCatch() в своем коде, но не смог реализовать хорошо.

Пожалуйста, помогите мне реализовать tryCatch() в моем коде, который может сохранить ошибку в другом файле и продолжить цикл for().

Код:

for (i in 1:R_column_len){
        R_column_data <- (file_data[[6]][i])
      a <- eval(parse(text = R_column_data))
      write.table(a,file = sprintf("C:/Results/F_Query_Prod_%s.txt", i))
    }

1 Ответ

0 голосов
/ 25 октября 2018

Может быть, это иллюстрирует общую идею

library(futile.logger)

f <- function() {
    for (i in 1:10) {
        tryCatch({
            if (i %% 3 == 0)
                stop("my bad")
            ## normal behavior
            flog.info("i = %d", i)
        }, error = function(e) {
            ## error behavior
            flog.error("oops, i = %d: %s", i, conditionMessage(e))
        })
    }
}

производство вывода

> f()
INFO [2018-10-25 15:50:05] i = 1
INFO [2018-10-25 15:50:05] i = 2
ERROR [2018-10-25 15:50:05] oops, i = 3: my bad
INFO [2018-10-25 15:50:05] i = 4
INFO [2018-10-25 15:50:05] i = 5
ERROR [2018-10-25 15:50:05] oops, i = 6: my bad
INFO [2018-10-25 15:50:05] i = 7
INFO [2018-10-25 15:50:05] i = 8
ERROR [2018-10-25 15:50:05] oops, i = 9: my bad
INFO [2018-10-25 15:50:05] i = 10

Использование функций futile.logger для добавления в файл, а не на консоль, и для записи только ошибок

fl <- tempfile()
flog.appender(appender.file(fl))
flog.threshold(ERROR)
f()

результат

> readLines(fl)
[1] "ERROR [2018-10-26 06:28:37] oops, i = 3: my bad"
[2] "ERROR [2018-10-26 06:28:37] oops, i = 6: my bad"
[3] "ERROR [2018-10-26 06:28:37] oops, i = 9: my bad"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...