在R中使用assertthat处理pairlist内断言条件的问题
解决assertthat::assert_that()使用pairlist中断言的精准错误信息问题
要解决这个问题,核心是让assert_that()能获取到原始断言表达式的文本信息,而不是只处理表达式的求值结果。以下是两种可行的方案:
方案1:用do.call()批量传递断言
assert_that()支持同时传入多个断言参数,我们可以直接把pairlist作为参数列表传递给它,这样assert_that()会像处理手动输入的断言一样,解析每个表达式并生成精准错误。
示例代码:
library(assertthat) # 定义包含断言的pairlist pairlist_1 <- as.pairlist(alist(is.null(list()), is.na(list()))) # 用do.call调用assert_that do.call(assert_that, pairlist_1)
运行后会抛出和直接调用assert_that(is.null(list()))完全一致的错误:
Error: list() is not NULL
方案2:用!!操作符逐个注入断言
如果需要逐个处理pairlist中的断言,可以用rlang包的!!(bang-bang)操作符将原始表达式注入到assert_that()调用中,保留表达式的文本信息。
示例代码:
library(assertthat) library(rlang) pairlist_1 <- as.pairlist(alist(is.null(list()), is.na(list()))) # 遍历pairlist逐个验证 for (expr in pairlist_1) { assert_that(!!expr) }
同样会输出精准的错误提示:Error: list() is not NULL
为什么之前的方法无效?
- 直接传入
eval(expr):此时传递给assert_that()的是布尔值(TRUE/FALSE),它无法关联到原始断言表达式,只能生成模糊的"eval(...) is not TRUE"错误。 - 直接传入
expr对象:assert_that()会将其解析为pairlist_1[[1]]这样的变量引用,而非原始断言表达式,错误信息也会偏离预期。
内容的提问来源于stack exchange,提问作者dkarlez
相关产品推荐
相关产品推荐

