R:使用 eval() 的 dbplyr

Joa*_*nna 2 r dplyr dbplyr

我有一个关于如何eval(parse(text=...))dbplyrSQL 翻译中使用的问题。下面的代码正是我想要dplyreval(parse(text=eval_text))

selected_col <- c("wt", "drat")

text <- paste(selected_col, ">3")

implode <- function(..., sep='|') {
  paste(..., collapse=sep)
}

eval_text <- implode(text)

mtcars %>% dplyr::filter(eval(parse(text=eval_text)))

Run Code Online (Sandbox Code Playgroud)

但是当我将其放入数据库时​​,它返回一条错误消息。我正在寻找任何允许我动态设置列名称并使用or运算符进行过滤的解决方案。

db <- tbl(con, "mtcars") %>%
     dplyr::filter(eval(parse(eval_text)))

db <- collect(db)
Run Code Online (Sandbox Code Playgroud)

谢谢!

Sim*_*.A. 5

正确的方法,但 dbplyr 往往与可以接收!!运算符(“bang-bang”运算符)的东西一起工作得更好。dplyr 曾一度拥有接受文本输入的*_函数版本(例如)。filter_现在这是使用 NSE(非标准评估)来完成的。

一些参考资料:shiptechr-bloggers(抱歉找不到官方 dplyr 参考资料)。

为了您的目的,您应该找到以下作品:

library(rlang)
df %>% dplyr::filter(!!parse_expr(eval_text))
Run Code Online (Sandbox Code Playgroud)

全面工作:

library(dplyr)
library(dbplyr)
library(rlang)
data(mtcars)
df = tbl_lazy(mtcars, con = simulate_mssql()) # simulated database connection

implode <- function(..., sep='|') { paste(..., collapse=sep) }

selected_col <- c("wt", "drat")
text <- paste(selected_col, ">3")
eval_text <- implode(text)

df %>% dplyr::filter(eval(parse(eval_text))) # returns clearly wrong SQL

df %>% dplyr::filter(!!parse_expr(eval_text)) # returns valid & correct SQL

df %>% dplyr::filter(!!!parse_exprs(text)) # passes filters as a list --> AND (instead of OR)
Run Code Online (Sandbox Code Playgroud)