R: добавить элементы в список в цикле в tryCatch - PullRequest
0 голосов
/ 05 ноября 2018

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

Я использую трюк из этого поста , используя c() для заполнения списка (хотя я знаю, что он медленный):

myRows <- c()
for (i in 1:nrow(myDataframe)) {
  tryCatch({myDataframe$myJSONstring[i] %>%
    fromJSON() %>%
    length()},
    error = function(e) {print(i); myRows <- c(myRows, i)})
}

Однако это не работает. print(i) работает нормально, но после запуска цикла myRows остается пустым списком. Есть ли какое-то ограничение на то, какой код может выполняться в бите ошибки tryCatch?

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Хотя уже есть принятый ответ , я опубликую другой способ, не создавая среду.
Если результат tryCatch присвоен переменной, его можно проверить позже. Хитрость заключается в том, чтобы вернуть ошибку в функцию ошибки.
Пример на основе принятого ответа, те же ошибки.

vec <- rep(1:0, each = 5)

ans <- lapply(seq_along(vec), function(i) {
  tryCatch({ if(vec[i]) stop("error message") else "success" },
           error = function(e) e)
})

bad <- sapply(ans, inherits, "error")
#[1]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE
0 голосов
/ 05 ноября 2018

Вот небольшой пример того, как вы могли бы решить вашу проблему: (кажется, все кричат ​​о <<-. Каким-то образом присвоение глобальной области видимости или глобальных переменных кажется плохой практикой.)

env = environment()
env$ans <- rep("works",10)

vec <- rep(1:0,each = 5)

for (i in seq_along(vec)) {
    tryCatch({ if(vec[i]) stop("error message") else {"success"} },
            error = function(e) {print(i); env$ans[i] <- "error"})
}

#> env$ans
# [1] "error" "error" "error" "error" "error" "works" "works" "works" "works" "works"

Так что, если вы вызываете свойство среды env, вы можете получить к нему доступ изнутри tryCatch.

...