簡體   English   中英

使用 apply 函數而不是 apply 用於 eval 解析而不是循環

[英]Use apply function instead of apply for eval parse instead of loop

解釋我的用例很復雜,但我正在處理一個需要解析可能會引發一些錯誤的文本的項目。 我想使用tryCatch()以便盡可能多的腳本可以運行並提醒用戶某些代碼失敗。 我可以為此使用循環,但我想知道為什么存在這種行為,以及是否有一個應用函數可以解決這個問題。

當我在這個解析的對象上運行循環或使用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

您看到的打印是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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM