首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用apply函数代替apply for eval parse而不是循环

使用apply函数代替apply for eval parse而不是循环
EN

Stack Overflow用户
提问于 2019-09-05 13:01:04
回答 1查看 93关注 0票数 1

解释我的用例很复杂,但我正在做一个项目,它需要解析可能会抛出一些错误的文本。我想使用tryCatch(),以便尽可能多的脚本可以运行,并警告用户某些代码失败。我可以使用循环来实现这一点,但我想知道为什么会出现这种行为,以及是否有应用函数可以做到这一点。

当我在这个解析的对象上运行循环或使用do.call()时,我只得到了预期的单个错误消息。当我使用lapply()时,我得到相同的错误消息,后面跟着赋值的输出。我尝试过在lapply()周围抛出抑制函数,显然,这并不起作用。对于sapply()map(),我得到了类似的输出。好奇有没有人能给我解释一下。

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-06 14:50:18

您看到的打印是lapply函数的输出。您可以通过将结果赋给一个变量来抑制它,或者如果您真的不关心存储输出,可以在invisible中使用下面的技巧。

代码语言:javascript
运行
复制
> 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))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57798682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档