R语言assertr包verify传入列名向量校验失败如何解决
R语言assertr包传入列名向量做列名校验的实现方法
问题场景
做第三方导入数据集的质量校验时,需要验证传入数据集的所有列名符合预先约定的命名规则,选用R语言assertr包的verify搭配has_all_names实现逻辑时出现异常:
- 手动逐行传入独立列名作为参数时,校验逻辑可正常运行
- 将待校验列名存入向量后传入函数,即使向量内容和手动输入的列名完全一致,也会抛出校验失败错误
问题复现
以R内置iris数据集为例,复现代码如下:
- 生成待校验列名向量(实际业务场景中该向量从数据库读取获取)
# 生成待校验列名示例向量 (names(iris) -> expected_variable_names)
运行输出:
[1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species"
- 执行校验逻辑对比
library(dplyr) library(assertr) # 手动传入独立列名:运行正常,校验通过 iris %>% verify(has_all_names("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width", "Species")) # 直接传入列名向量:运行失败,抛出校验错误 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
报错原因
has_all_names函数通过...形参接收多个独立的字符串参数作为待匹配列名,不会自动解析单个向量内的多个元素。直接传入列名向量时,函数会把整个向量识别为1个待查找的列名,自然无法匹配到数据集中的对应列,最终触发校验失败。
可行解决方案
方法1:使用tidy eval的参数拆分符!!!(推荐,适配管道操作习惯)
!!!可以将向量中的每个元素拆分为独立的参数传入函数,和手动逐个输入列名的效果完全一致:
# 校验可正常通过 iris %>% verify(has_all_names(!!!expected_variable_names))
方法2:使用do.call构造函数调用
如果不熟悉tidy eval语法,可以用do.call把向量转成参数列表传入函数,效果相同:
# 校验可正常通过 iris %>% verify(do.call(has_all_names, as.list(expected_variable_names)))
注意:如果列名向量是从外部文件、数据库读取得到,需要先确认向量为字符型,避免因因子类型转换导致列名匹配异常。
内容的提问来源于stack exchange,提问作者StatsStudent
相关产品推荐
相关产品推荐

