【问题标题】:How to use list elements to query data from a database using dplyr?如何使用列表元素使用 dplyr 从数据库中查询数据?
【发布时间】:2021-03-11 10:44:07
【问题描述】:

我使用dplyr(0.8.3版本)查询数据。该查询包括在查询开头定义的参数,如下面的第一个表示所示。最重要的是,我想在列表中收集参数,如第二个表示。第一个和第二个示例从数据框中查询数据,工作正常。但是,当我想使用保存在列表中的参数从数据库中查询数据时,SQL 转换会产生无法用于从数据库中查询数据的非工作 SQL。

有没有办法将列表条目合并到dplyr 管道中以从数据库中查询数据?

library(dplyr)
library(dbplyr)
library(RSQLite)

# 1. Data frame: value 
a <- 1
mtcars %>% filter(vs == a) # Works

# 2. Data frame: list value
input <- list()
input$a <- 1
mtcars %>% filter(vs == input$a) # Works

# 3. Database: value and list value
con <- DBI::dbConnect(RSQLite::SQLite(), path = ":memory:")
copy_to(con, mtcars, "mtcars", temporary = FALSE)
db_mtcars <- tbl(con, "mtcars")

db_mtcars %>% filter(vs == a)          %>% show_query() %>% collect() # Works
db_mtcars %>% filter(vs == input$a)    %>% show_query() %>% collect() # Does not work
db_mtcars %>% filter(vs == input[1])   %>% show_query() %>% collect() # Does not work
db_mtcars %>% filter(vs == input[[1]]) %>% show_query() %>% collect() # Does not work

我的问题的背景是我想在shiny 应用程序中处理和分析数据。我发现开发用于处理应用程序外部数据的代码然后在应用程序中包含代码会更容易。然而,随着输入数量的增加,这项任务变得越来越困难。对于开发,我的想法是定义一个名为“输入”的列表,以便我可以将代码复制并粘贴到应用程序中。但是,我偶然发现了上面描述的问题。也非常欢迎对替代开发工作流程提出建议。

【问题讨论】:

    标签: r dplyr shiny dbplyr


    【解决方案1】:

    对于dplyr&gt;=1.0.0,您需要{{embrace}} 值,请参阅programming with dplyr

    db_mtcars %>% filter(vs == a)          %>% show_query() %>% collect() # Works
    db_mtcars %>% filter(vs == {{input$a}})    %>% show_query() %>% collect() # should work
    db_mtcars %>% filter(vs == {{input[1]}})   %>% show_query() %>% collect() # should work
    db_mtcars %>% filter(vs == {{input[[1]]}}) %>% show_query() %>% collect() # should work
    

    对于dplyr &lt;1.0.0,您可以使用bang bang !! 运算符:!!input$a

    【讨论】:

    • 我收到错误:“错误:arg 必须是符号运行rlang::last_error() 以查看错误发生的位置。”跟踪错误给出: arg must be an symbol Backtrace: 8. dplyr::filter(...) 10. rlang::quos(...) 运行rlang::last_trace() 以查看完整上下文.我使用dplyr 0.8.3 版,它比文档的版本旧。很遗憾,我无法更新版本。
    • 对于较旧的 dplyr 版本,请尝试使用 bang bang : !!input$a
    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    相关资源
    最近更新 更多