使用lares包corr_var函数时for循环变量赋值报错求助
解决lares::corr_var循环传参报错问题
问题原因
lares::corr_var的var参数要求传入裸变量名(比如直接写Sepal.Length),但循环中通过names(iris)[i]传入的是字符串形式的变量名(比如"Sepal.Length"),函数无法识别这种格式,因此抛出报错。
解决方案
借助rlang包的非标准求值工具,把字符串转换为函数能识别的变量引用即可解决:
- 先加载
rlang包; - 用
sym()将字符串变量名转为符号对象,再通过!!(bang-bang运算符)传入var参数; ignore参数本身支持字符串向量,直接按原逻辑传值即可。
修正后的for循环代码
library(lares) library(rlang) data("iris") corlist <- list() for(i in 1:2){ target_var <- sym(names(iris)[i]) corlist[[i]] <- corr_var( df = iris, var = !!target_var, ignore = names(iris)[c(1:2, 5)[-i]], max_pvalue = 0.05, top = 50 ) }
更简洁的lapply写法
如果偏好函数式编程风格,也可以用lapply替代for循环:
library(lares) library(rlang) data("iris") target_vars <- names(iris)[1:2] corlist <- lapply(target_vars, function(var){ corr_var( df = iris, var = !!sym(var), ignore = setdiff(c(target_vars, names(iris)[5]), var), max_pvalue = 0.05, top = 50 ) })
补充说明
sym()负责将字符串转换为R语言的符号对象,对应裸变量名格式;!!的作用是在函数内部“注入”符号对象,让corr_var识别为对应的数据集变量;ignore参数本身支持字符串向量,无需额外转换处理。
内容的提问来源于stack exchange,提问作者Alexander Klug
相关产品推荐
相关产品推荐

