R语言循环传递变量至gini_scorecard函数报错的解决求助
问题解决:R循环中传递字符串列名到使用
enquo的函数 问题原因
gini_scorecard函数通过enquo(model)捕获传入的参数,当你直接传递字符串变量var时,enquo会将其解析为符号var,而非var中存储的列名字符串,导致函数在数据框中寻找名为var的列,从而抛出Error: Column var is unknown错误。
解决方案(不修改原函数)
需要将字符串格式的列名转换为R语言的符号,再注入到函数调用中,让enquo能正确捕获目标列名。具体步骤如下:
- 确保加载
rlang包(未安装先执行install.packages("rlang")) - 在循环内修改
gini_scorecard的调用逻辑:
修改后的完整循环代码:
library(rlang) for(i in 1:nrow(temp)) { var = as.character(temp[i,1]) temp200 <- data_var %>% select(application_number, target_model_defn, target_trad_defn, current_eligible, main_applicants, registration_quarter, registration_month, registration_year, months_on_book, dev_period, contains(var)) # 将字符串转换为符号并注入函数调用 target_sym <- sym(var) gini_dev = gini_scorecard(temp200 %>% filter(dev_period == 1), !!target_sym, target_trad_defn, 1) }
或者使用rlang::inject简化写法:
library(rlang) for(i in 1:nrow(temp)) { var = as.character(temp[i,1]) temp200 <- data_var %>% select(application_number, target_model_defn, target_trad_defn, current_eligible, main_applicants, registration_quarter, registration_month, registration_year, months_on_book, dev_period, contains(var)) gini_dev = inject(gini_scorecard(temp200 %>% filter(dev_period == 1), !!sym(var), target_trad_defn, 1)) }
原理说明
rlang::sym(var):将字符串var转换为对应的R符号(比如var是"age"的话,就转换成符号age)!!:强制注入符号,让enquo(model)捕获到的是目标列名的符号,而非var本身这个符号rlang::inject:包裹函数调用,让内部的!!能正确解析,避免潜在的作用域问题
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

