R语言如何实现仅在函数运行失败时打印其传入参数?
问题原因
你当前的写法中,possibly()的otherwise参数是立即求值的:你写otherwise = message(x)时,只要执行到p <- possibly(...)这行代码,message(x)就会当场运行,和后续sum()是否执行失败没有关系,这就是调用t(1)时也会打印参数的核心原因。
修正方案
purrr 0.3.0及以上版本中,possibly的otherwise参数支持传入匿名函数,只有原函数执行失败时才会调用该函数获取兜底值,修正后代码如下:
library(purrr) t <- function(x) { p <- possibly( .f = sum, otherwise = ~ { message(x) NULL } ) p(x) }
测试效果
- 执行
t(1):sum()运行正常,仅返回结果[1] 1,不会打印额外参数 - 执行
t('a'):sum()运行失败,先打印参数a,再返回NULL,完全符合预期
备选方案(兼容低版本purrr)
如果你使用的purrr版本较低,也可以用R原生tryCatch实现相同逻辑:
t <- function(x) { tryCatch( sum(x), error = function(e) { message(x) NULL } ) }
内容的提问来源于stack exchange,提问作者Dambo
相关产品推荐
相关产品推荐

