我想从带有动态过滤器的sql服务器中提取一些数据。我通过以下方式使用了出色的R包dplyr:
#Create the filter
filter_criteria = ~ column1 %in% some_vector
#Connect to the database
connection <- src_mysql(dbname <- "mydbname",
user <- "myusername",
password <- "mypwd",
host <- "myhost")
#Get data
data <- connection %>%
tbl("mytable") %>% #Specify which table
filter_(.dots = filter_criteria) %>% #non standard evaluation filter
collect() #Pull data
这段代码可以正常工作,但是现在我想以某种方式在表的所有列上循环它,因此我想将过滤器编写为:
#Dynamic filter
i <- 2 #With a loop on this i for instance
which_column <- paste0("column",i)
filter_criteria <- ~ which_column %in% some_vector
然后使用更新的过滤器重新应用第一个代码。
不幸的是,这种方法无法获得预期的结果。实际上,它不会给出任何错误,但是甚至不会将任何结果提取到R中。
特别是,我仔细研究了由两段代码生成的SQL查询,并且有一个重要的区别。
在第一个有效的代码生成以下形式的查询时:
SELECT ... FROM ... WHERE
`column1` IN ....
(在列名中签名),第二个生成以下形式的查询:
SELECT ... FROM ... WHERE
'column1' IN ....
(在列名中签名)
有人对如何制定过滤条件以使其起作用有任何建议吗?
请您参考如下方法:
它与SQL无关。 R中的此示例也不起作用:
df <- data.frame(
v1 = sample(5, 10, replace = TRUE),
v2 = sample(5,10, replace = TRUE)
)
df %>% filter_(~ "v1" == 1)
它不起作用,因为您需要将
filter_
表达式传递给
~ v1 == 1
,而不是
~ "v1" == 1
表达式。
要解决此问题,只需使用引号运算符
quo
和引号运算符
!!
library(dplyr)
which_column = quot(v1)
df %>% filter(!!which_column == 1)