将 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
这个代码
> 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