R: dbplyr 使用 eval()
R: dbplyr using eval()
我有一个关于如何在 dbplyr
SQL 翻译中使用 eval(parse(text=...))
的问题。
以下代码使用 eval(parse(text=eval_text))
与 dplyr
完全符合我的要求
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)))
但是当我将它放入数据库时它returns 出现错误信息。我正在寻找任何允许我动态设置列名并使用 or
运算符进行过滤的解决方案。
db <- tbl(con, "mtcars") %>%
dplyr::filter(eval(parse(eval_text)))
db <- collect(db)
谢谢!
正确的方法,但 dbplyr 倾向于与可以接收 !!
运算符('bang-bang' 运算符)的东西一起工作得更好。在某一时刻,dplyr 有 *_
版本的函数(例如 filter_
)接受文本输入。现在使用 NSE(非标准评估)完成此操作。
一些参考资料:shiptech and r-bloggers(抱歉找不到官方 dplyr 参考资料)。
为了您的目的,您应该找到以下作品:
library(rlang)
df %>% dplyr::filter(!!parse_expr(eval_text))
全部工作:
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)
我有一个关于如何在 dbplyr
SQL 翻译中使用 eval(parse(text=...))
的问题。
以下代码使用 eval(parse(text=eval_text))
dplyr
完全符合我的要求
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)))
但是当我将它放入数据库时它returns 出现错误信息。我正在寻找任何允许我动态设置列名并使用 or
运算符进行过滤的解决方案。
db <- tbl(con, "mtcars") %>%
dplyr::filter(eval(parse(eval_text)))
db <- collect(db)
谢谢!
正确的方法,但 dbplyr 倾向于与可以接收 !!
运算符('bang-bang' 运算符)的东西一起工作得更好。在某一时刻,dplyr 有 *_
版本的函数(例如 filter_
)接受文本输入。现在使用 NSE(非标准评估)完成此操作。
一些参考资料:shiptech and r-bloggers(抱歉找不到官方 dplyr 参考资料)。
为了您的目的,您应该找到以下作品:
library(rlang)
df %>% dplyr::filter(!!parse_expr(eval_text))
全部工作:
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)