我正在尝试解析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的错误位中可以运行哪些代码是否有限制?
答案 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