首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R: dbplyr使用eval()

R: dbplyr使用eval()
EN

Stack Overflow用户
提问于 2021-02-06 12:58:09
回答 1查看 77关注 0票数 1

我有一个关于如何在dbplyr SQL转换中使用eval(parse(text=...))的问题。下面的代码完全符合我希望使用eval(parse(text=eval_text))dplyr的工作方式

代码语言:javascript
复制
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操作符进行过滤的解决方案。

代码语言:javascript
复制
db <- tbl(con, "mtcars") %>%
     dplyr::filter(eval(parse(eval_text)))

db <- collect(db)

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-07 17:19:28

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

几个引用:shiptechr-bloggers (对不起,找不到官方的dplyr引用)。

对于您的目的,您应该找到以下作品:

代码语言:javascript
复制
library(rlang)
df %>% dplyr::filter(!!parse_expr(eval_text))

完整的工作:

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66073734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档