r - dplyr的filter_中的非标准评估(NSE),并从MySQL中提取数据

标签 r lazy-evaluation dplyr

我想从带有动态过滤器的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)

关于r - dplyr的filter_中的非标准评估(NSE),并从MySQL中提取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26492280/

相关文章:

r - 如何正确从 .csv 创建 XML?

clojure - Clojure 中序列的惰性串联

r - Mutate_all 除了某些列

r - 为什么 mutate() 和 add_column() 不接受相同的基本参数?

r - 包含 "_"的单独字符串

r - 如何在 R 中每 n 行创建一个具有相同 id 的新列?

R - 安装源包时出错 : unknown timezone GMT

r - 在 R 中定义场合(按季节)而不基于年份

Scala案例类禁止按名称调用参数?

java - 延迟初始化完整性检查 : Variable might not have been initialized