这段代码
> A <- data.frame(col1 = c(1,2,3),col2 = c("red","blue","green"))
> color_num <- 2
> fn$sqldf("select * from A where col1 >= '$color_num'")
产生错误
在执行eval(parse(text = paste(..., sep = "")), env)时出错:对象'color'未找到
但是,如果变量color_num
的名称改为没有下划线的名称(例如colornum
),则执行fn$sqldf("select * from A where col1 >= '$colornum'")
将返回预期的结果,且不会出现错误。
我认为sqldf
在后台使用点号替换下划线,导致它将下划线之前的部分视为表名,将其后面的部分视为列名。关于sqldf
中列名的问题,这个答案(以及评论)表示该库曾经将点号替换为下划线,但现在不再替换,但我没有找到任何有关用点号替换下划线的信息。
这是一个问题,因为我使用的命名约定在变量名中大量使用下划线。
有没有办法在sqldf
查询中使用带有下划线的变量名?
[ ]
包裹在变量名周围,但没有成功。关于使用paste0
构建字符串,这并不理想,因为变量名可以出现在复杂的 SQL 字符串中的许多位置,所以我必须将许多不同的子字符串paste0
在一起。理想的解决方案是允许sqldf
中标准的变量名使用下划线,因为下划线通常出现在变量名中。有办法做到这一点吗? - Rookatusql
包中的一个错误,这里有一个解决方案,您可以将_
更改为.
,以便您的代码能够正常工作。如果您喜欢这个解决方案,我可以使用lapply
来扩展它,以更改所有变量。-assign(gsub("_",".",setdiff(ls(),c("A") )) ,get(setdiff(ls(),c("A") )))
- Mike