使用apply函数而不是eval解析而不是循环

时间:2019-09-05 05:01:03

标签: r

解释用例很复杂,但是我正在开发一个项目,该项目需要解析可能会引发一些错误的文本。我想使用tryCatch(),以便尽可能多的脚本可以运行并警告用户某些代码失败。我可以为此使用一个循环,但我想知道为什么存在此行为,以及是否存在执行此操作的apply函数。

当我运行循环或对该解析对象使用do.call()时,我只会得到预期的单个错误消息。当我使用lapply()时,会得到相同的错误消息,然后是分配的输出。我尝试在lapply()周围抛出抑制函数,这也许显然不起作用。并且我得到sapply()map()的类似输出。好奇是否有人可以向我解释。

test_text <- parse(text = "x <- pi; y <- x; z <- stop()")


eval_try <- function(x) {
  tryCatch(
    eval(x, envir = .GlobalEnv),
    error = function(cond) message("there was an error"),
    warning = function(cond) message("there was a warning")
  )  
}


for (i in seq_along(test_text)) {
  eval_try(test_text[i])
}
#> there was an error


do.call("eval_try", list(test_text))
#> there was an error


lapply(test_text, eval_try)
# there was an error
# [[1]]
# [1] 3.141593
#
# [[2]]
# [1] 3.141593
#
# [[3]]
# NULL

1 个答案:

答案 0 :(得分:1)

您看到的打印内容是lapply函数的输出。您可以通过将结果分配给变量来抑制它,或者如果您真的不在乎存储输出,请对invisible使用以下技巧。

> myfun <- function(x) x
> 
> lapply(1:3, FUN = myfun)
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 3

> a <- lapply(1:3, FUN = myfun)
> invisible(lapply(1:3, FUN = myfun))