将要验证的名称向量传递给断言者在 R 中的验证
Passing vector of names to verify to assertr's verify in R
我正在从第三方导入数据集,并希望能够验证传入数据集中的所有列是否按照约定和预期命名。为此,我打算将 assertr
的 assertr
包中的 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)))
我正在从第三方导入数据集,并希望能够验证传入数据集中的所有列是否按照约定和预期命名。为此,我打算将 assertr
的 assertr
包中的 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)))