将要验证的名称向量传递给断言者在 R 中的验证

Passing vector of names to verify to assertr's verify in R

我正在从第三方导入数据集,并希望能够验证传入数据集中的所有列是否按照约定和预期命名。为此,我打算将 assertrassertr 包中的 verify 语句与 has_all_names 一起使用。如果我手动输入要验证的列名,我可以毫无问题地完成此操作,但我似乎无法通过传入包含要验证的列名的向量来完成此操作。因此,例如,使用内置 iris 数据集,如果我手动输入名称作为 has_all_names 函数的参数,我可以验证所有列名称是否存在,但如果我将名称存储在矢量并尝试使用它进行验证,它不起作用:

#Create a sample list of column names to be verified
#In my real work, I obtain this list from a database
(names(iris)->expected_variable_names)

输出:

[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width" "Species"

但后来我 运行 以下内容和:

#This works:
iris %>% verify(has_all_names("Sepal.Length", "Sepal.Width",  "Petal.Length", "Petal.Width",  "Species"))

#But this does not:
iris %>% verify(has_all_names(expected_variable_names))

当我尝试 运行 不起作用的行时,生成:

verification [has_all_names(expected_variable_names)] failed! (1 failure)

    verb redux_fn                              predicate column index value
1 verify       NA has_all_names(expected_variable_names)     NA     1    NA

Error: assertr stopped execution

显然,失败的尝试表明并非所有列名都在数据框中找到,但由于我传递的是数据集中确实存在的所有变量名,它应该会成功。我怎样才能将一个向量或一个列名列表传递给 verify 以进行验证?我已经尝试了最后一次尝试的多种不同变体,但都没有成功。

谢谢。

我们可以用invoke

library(purrr)
library(dplyr)
library(assertr)
iris %>% 
    verify(invoke(has_all_names, expected_variable_names))

-输出

  Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1            5.1         3.5          1.4         0.2     setosa
2            4.9         3.0          1.4         0.2     setosa
3            4.7         3.2          1.3         0.2     setosa
4            4.6         3.1          1.5         0.2     setosa
5            5.0         3.6          1.4         0.2     setosa
6            5.4         3.9          1.7         0.4     setosa
7            4.6         3.4          1.4         0.3     setosa
8            5.0         3.4          1.5         0.2     setosa
9            4.4         2.9          1.4         0.2     setosa
10           4.9         3.1          1.5         0.1     setosa
...

exec 来自 rlang

library(rlang)
iris %>% 
    verify(exec(has_all_names, !!!expected_variable_names))

do.call 来自 base R

iris %>% 
   verify(do.call(has_all_names, 
          as.list(expected_variable_names)))