R:在tryCatch的循环中将元素添加到列表中

时间:2018-11-05 13:30:37

标签: r list loops try-catch

我正在尝试解析dataframe列中包含的JSON,其中一些已损坏。第一步,我要确定损坏的行,并使用它来对数据帧进行子集化。

我正在使用this post中的技巧,使用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 :(得分:2)

这是解决问题的一个小例子:(每个人似乎都对<<-感到哭泣。以某种方式分配给全局范围或全局变量似乎是一种不好的做法。)

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内部访问它。

答案 1 :(得分:1)

尽管已经有accepted answer,但我将发布另一种方式,而不创建环境。
如果将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