将 sqldf 与名称中包含下划线的 r 变量一起使用

Using sqldf with r variable containing underscore in its name

这个代码

> 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'")

产生错误

Error in eval(parse(text = paste(..., sep = "")), env) : object 'color' not found

但是如果变量 color_num 被赋予一个没有下划线的名称(例如 colornum),那么执行 fn$sqldf("select * from A where col1 >= '$colornum'") 会产生预期的结果而没有错误。

我相信 sqldf 正在幕后用句点替换下划线,导致它将下划线前面的组件视为 table 并将后面的部分视为列名。 This answer(和评论)对 sqldf 中关于列名的问题表示库曾用下划线替换点但现在不再用了,但我找不到任何关于用点替换下划线的信息.

这是一个问题,因为我使用的命名约定大量使用下划线作为变量名。

有什么方法可以在 sqldf 查询中获取带有下划线的变量名?

您可以在 sql 代码周围使用 paste0,以便 r 将 color_num 计算为 2,然后将其粘贴到一个 sql 语句中。

library(sqldf)
    A <- data.frame(col1 = c(1,2,3),col2 = c("red","blue","green"))
    color_num <- 2

    fn$sqldf(paste0("select * from A where col1 >=",color_num))

如果您想使用 $var 方法并且在使用 _ 时遇到问题,这里有一个变通方法可以让所有变量都具有 .而不是 _ ,这可能效率低下但有效。

color_col <- "blue"
#get list of values with underscores and not your df
nms <- setdiff(ls(),c("A"))
#change name of list to have '.' instead of '_'
setNames(nms,gsub("_",".",nms))
#Assign values to names with '.'s
myvars <- lapply(setNames(nms,gsub("_",".",nms)), function(x){
  assign(gsub("_",".",x) , get(x))})
#bring them to global env
list2env(myvars,.GlobalEnv)

#run example query
fn$sqldf("select * from A where col1 >= '$color.num' and col2 = '$color.col' ")

您可以使用反引号:

fn$sqldf("select * from A where col1 >= `color_num`")
##   col1  col2
## 1    2  blue
## 2    3 green