管道列名断言

问题描述

我正在尝试使用 assertive 包进行运行时测试,并且我想使用管道传递列名。

这是一个简单的例子:

library(tidyverse)
library(assertive)
df <- tibble(Name = c("DONALD","JaimE","LINDA"))

这有效但不使用管道:

assertive::assert_all_are_true(df$Name == str_to_upper(df$Name))

这使用了管道,但不起作用:

df %>% assertive::assert_all_are_true(Name == str_to_upper(Name))
#> Error in match.arg(severity): object 'Name' not found

如何通过管道将列名传送到 assertive

解决方法

我们可以使用with

library(dplyr)
df %>% 
     with(.,assertive::assert_all_are_true(Name == str_to_upper(Name)))

或使用 .$

提取列
df %>%
    {assertive::assert_all_are_true(.$Name == str_to_upper(.$Name))}

或使用来自 |>R 4.1.0

df |> 
    {\(x) assertive::assert_all_are_true(x$Name == str_to_upper(x$Name))}()