gpt4 book ai didi

R:使用 eval() 的 dbplyr

转载 作者:行者123 更新时间:2023-12-02 02:23:36 25 4
gpt4 key购买 nike

我有一个关于如何在 dbplyr SQL 翻译中使用 eval(parse(text=...)) 的问题。以下代码完全按照我想要的方式使用 dplyr 使用 eval(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)))

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

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

db <- collect(db)

谢谢!

最佳答案

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

一些引用文献:shiptechr-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)

关于R:使用 eval() 的 dbplyr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66073734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com