【问题标题】:R: dbplyr using eval()R:使用 eval() 的 dbplyr
【发布时间】:2021-02-06 04:58:09
【问题描述】:

我有一个关于如何在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)

谢谢!

【问题讨论】:

    标签: r dplyr dbplyr


    【解决方案1】:

    正确的方法,但 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多