为何assert_that提示断言需返回逻辑值,但all(between(...))已返回单个逻辑值?
问题原因
你错误地使用了%>%管道符将数据框传递给assert_that,但assert_that的第一个参数要求是单个逻辑值,而非数据对象。
当执行data %>% assert_that(all(between(Var 1, 0, 1)))时,管道符会自动把左侧的data作为第一个参数传给assert_that,等价于运行:
assert_that(data, all(between(`Var 1`, 0, 1)))
这里第一个参数是tibble类型,不是逻辑值,因此触发了assert_that: assertion must return a logical value错误。
解决方案
有两种常见的修正方式:
方式1:直接引用数据框变量(不用管道)
直接在断言中明确指定数据框的列,无需依赖管道传参:
library(assertthat) library(tidyverse) data <- tibble(`Var 1` = c(0.1, 0.2, 0.5), `Var 2` = c(0.1, 2, 5)) assert_that(all(between(data$`Var 1`, 0, 1)))
方式2:使用%$%管道(暴露数据框列)
如果习惯用管道风格,可以使用magrittr包的%$%管道(tidyverse已包含该包),它会将数据框的列直接暴露在当前环境中,无需额外引用数据框:
library(assertthat) library(tidyverse) data <- tibble(`Var 1` = c(0.1, 0.2, 0.5), `Var 2` = c(0.1, 2, 5)) data %$% assert_that(all(between(`Var 1`, 0, 1)))
内容的提问来源于stack exchange,提问作者Michael A
相关产品推荐
相关产品推荐

