此代码
> 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
查询中,有什么方法可以获取带下划线的变量名吗?
答案 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