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

时间:2018-11-06 14:01:34

标签: r naming-conventions sqldf

此代码

> 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_num一个没有下划线的名称(例如colornum),那么执行fn$sqldf("select * from A where col1 >= '$colornum'")会产生预期的结果而不会出错。

我相信sqldf会将下划线替换为幕后的句点,从而使下划线之前的部分视为表格,其后的部分作为列名称。对sqldf中的列名的问题的This answer(和评论)表明,库一次将下划线替换为下划线,但不再这样做,但是我找不到关于下划线被替换为圆点的任何信息。

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

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

2 个答案:

答案 0 :(得分:1)

您可以在paste0代码周围使用sql,以便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' ")

答案 1 :(得分:1)

您可以使用反引号:

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