R语言函数传参报错:Error: no such column: vr
解决sqldf函数中变量引用导致的"no such column"错误
你的问题出在没有正确在SQL字符串中插值R变量——fn$sqldf虽然支持R变量插值,但你直接写vr的话,SQL会把它当成一个列名,而不是你传入的"loantype"参数值,所以才会报错说找不到vr列。
下面给你两种可行的解决方案:
方法1:用fn$sqldf的原生插值语法
fn$前缀允许你在SQL字符串里用$变量名来直接引用R变量,修改后的函数如下:
sss <- function(dsn, vr){ # 用$vr替换字符串里的vr,让sqldf识别到这是R变量 tt <- fn$sqldf("select $vr, count($vr) as cnt from dsn group by 1 order by cnt desc") return(tt) }
调用的时候,不管你传"loantype"还是c("loantype")都可以正常运行,因为单个元素的向量会被自动解析成字符串。
方法2:手动构建SQL字符串(更灵活,适合多列场景)
如果你需要支持传入多个列名(比如c("loantype", "status")),可以先把列名拼接成逗号分隔的字符串,再构建SQL语句:
sss <- function(dsn, vr){ # 把多个列名拼接成SQL能识别的格式 vr_cols <- paste(vr, collapse = ", ") # 用sprintf替换占位符 sql_query <- sprintf("select %s, count(%s) as cnt from dsn group by %s order by cnt desc", vr_cols, vr_cols, vr_cols) tt <- sqldf(sql_query) return(tt) }
这个版本的函数可以处理单列和多列的情况,比如调用sss(ln0105, c("loantype", "status"))会按这两列分组统计。
小提示
如果你的列名包含特殊字符(比如空格),需要用反引号把列名包起来,比如修改插值部分为`$vr`,或者在拼接列名时加上反引号:
vr_cols <- paste0("`", vr, "`", collapse = ", ")
内容的提问来源于stack exchange,提问作者Amit Kumar
相关产品推荐
相关产品推荐

