【问题标题】:R: add elements to list in a loop in a tryCatchR:在tryCatch的循环中添加元素到列表
【发布时间】:2019-04-08 20:55:53
【问题描述】:

我正在尝试解析包含在数据框列中的 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 的错误位中可以运行哪些代码是否有一些限制?

【问题讨论】:

  • 这是一个范围问题(您在函数的本地范围内进行分配)。你可能可以做myRows &lt;&lt;- c(myRows, i),但我不确定如果不测试它。 tryCatch 中的范围有点复杂。最好你应该重新设计整个方法。

标签: r list loops try-catch


【解决方案1】:

这里有一个小例子来说明如何解决你的问题:(每个人似乎都在为 &lt;&lt;- 哭泣。不知何故,分配给全局范围或全局变量似乎是一种不好的做法。)

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

【讨论】:

    【解决方案2】:

    虽然已经有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
    

    【讨论】:

      猜你喜欢
      • 2015-01-25
      • 2020-08-12
      • 2016-08-25
      • 2017-09-22
      • 2014-12-17
      • 1970-01-01
      • 1970-01-01
      • 2015-06-01
      • 2021-09-10
      相关资源
      最近更新 更多