如何使用列表元素使用dplyr从数据库中查询数据?
How to use list elements to query data from a database using dplyr?
我使用dplyr
(版本0.8.3)查询数据。查询包括在查询开头定义的参数,如下面的第一个 reprex 所示。最重要的是,我想在列表中收集参数,如第二个 reprex 所示。从数据框中查询数据的第一个和第二个示例工作正常。但是,当我想使用保存在列表中的参数从数据库中查询数据时,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
应用中处理和分析数据。我发现在应用程序外部开发处理数据的代码,然后将代码包含在应用程序中更容易。然而,随着输入数量的增加,这项任务变得越来越困难。对于开发,我的想法是定义一个名为“input”的列表,这样我就可以将代码复制并粘贴到应用程序中。但是,我偶然发现了上述问题。也非常欢迎提出替代开发工作流程的建议。
对于 dplyr>=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 <1.0.0
您可以使用 bang bang !!
运算符:!!input$a
.
我使用dplyr
(版本0.8.3)查询数据。查询包括在查询开头定义的参数,如下面的第一个 reprex 所示。最重要的是,我想在列表中收集参数,如第二个 reprex 所示。从数据框中查询数据的第一个和第二个示例工作正常。但是,当我想使用保存在列表中的参数从数据库中查询数据时,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
应用中处理和分析数据。我发现在应用程序外部开发处理数据的代码,然后将代码包含在应用程序中更容易。然而,随着输入数量的增加,这项任务变得越来越困难。对于开发,我的想法是定义一个名为“input”的列表,这样我就可以将代码复制并粘贴到应用程序中。但是,我偶然发现了上述问题。也非常欢迎提出替代开发工作流程的建议。
对于 dplyr>=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 <1.0.0
您可以使用 bang bang !!
运算符:!!input$a
.