闪亮的传递输入到 dbplyr 过滤管道
Shiny pass input into dbplyr filter pipe
我正在尝试使用文本输入在闪亮的仪表板中过滤 postgre table。我需要过滤从 selectinput 中选择的特定列。问题是 table 的列名以“_”开头,即“_7_track”,所以我在正确表达时遇到了很多麻烦。
这是我的服务器代码
column_to_look<-paste0("_",input$column_to_look,"_track")
dbDataCon<-DBI::dbConnect(RPostgreSQL::PostgreSQL(), user='xxx', password='xxx', dbname='xxx', host='nnn.nnn.nn.nnn')
db_tracing<-dplyr::tbl(dbDataCon,'r_tracing_mfg') %>%
filter(column_to_look == "P321LM000011")%>%
collect()
其中输入 $column_to_look 是一个数字 (7),字符串 column_to_look 变为“_7_track”。
我得到一个 0*0 table,如果我要求查询翻译是:
db_tracing %>% show_query()
<SQL>
SELECT *
FROM "r_tracing_mfg"
WHERE ('_7_track' = 'P321LM000011')
DBeaver(我用来处理数据库)生成此查询:
SELECT *
来自 r_tracing_mfg
其中“_7_track”= 'P321LM000011'
有效。
如果我直接在 dbplyr 的管道中键入此代码:
db_tracing<-dplyr::tbl(dbDataCon,'r_tracing_mfg') %>%
filter(`_7_track` == "P321LM000011") %>%
collect()
请求有效,我获得了一个 table 和 n*n 匹配的观察结果。在这种情况下 show_query() 给我:
<SQL>
SELECT *
FROM "r_tracing_mfg"
WHERE ("_7_track" = 'P321LM000011')
那么我怎样才能重现这第二种行为呢?我已经尝试过,当然是徒劳的,
paste0("`_",input$column_to_look,"_track`")
我认为将 paste0(...)
包裹在 !!sym()
中会奏效。我会尝试:
library(glue)
column_to_look<-glue_sql("_{input$column_to_look}_track")
dbDataCon<-DBI::dbConnect(RPostgreSQL::PostgreSQL(), user='xxx', password='xxx', dbname='xxx', host='nnn.nnn.nn.nnn')
db_tracing<-dplyr::tbl(dbDataCon,'r_tracing_mfg') %>%
filter(!!sym(column_to_look) == "P321LM000011")%>%
collect()
使用 glue_sql
而不是 paste0
我正在尝试使用文本输入在闪亮的仪表板中过滤 postgre table。我需要过滤从 selectinput 中选择的特定列。问题是 table 的列名以“_”开头,即“_7_track”,所以我在正确表达时遇到了很多麻烦。
这是我的服务器代码
column_to_look<-paste0("_",input$column_to_look,"_track")
dbDataCon<-DBI::dbConnect(RPostgreSQL::PostgreSQL(), user='xxx', password='xxx', dbname='xxx', host='nnn.nnn.nn.nnn')
db_tracing<-dplyr::tbl(dbDataCon,'r_tracing_mfg') %>%
filter(column_to_look == "P321LM000011")%>%
collect()
其中输入 $column_to_look 是一个数字 (7),字符串 column_to_look 变为“_7_track”。
我得到一个 0*0 table,如果我要求查询翻译是:
db_tracing %>% show_query()
<SQL>
SELECT *
FROM "r_tracing_mfg"
WHERE ('_7_track' = 'P321LM000011')
DBeaver(我用来处理数据库)生成此查询:
SELECT *
来自 r_tracing_mfg
其中“_7_track”= 'P321LM000011'
有效。
如果我直接在 dbplyr 的管道中键入此代码:
db_tracing<-dplyr::tbl(dbDataCon,'r_tracing_mfg') %>%
filter(`_7_track` == "P321LM000011") %>%
collect()
请求有效,我获得了一个 table 和 n*n 匹配的观察结果。在这种情况下 show_query() 给我:
<SQL>
SELECT *
FROM "r_tracing_mfg"
WHERE ("_7_track" = 'P321LM000011')
那么我怎样才能重现这第二种行为呢?我已经尝试过,当然是徒劳的,
paste0("`_",input$column_to_look,"_track`")
我认为将 paste0(...)
包裹在 !!sym()
中会奏效。我会尝试:
library(glue)
column_to_look<-glue_sql("_{input$column_to_look}_track")
dbDataCon<-DBI::dbConnect(RPostgreSQL::PostgreSQL(), user='xxx', password='xxx', dbname='xxx', host='nnn.nnn.nn.nnn')
db_tracing<-dplyr::tbl(dbDataCon,'r_tracing_mfg') %>%
filter(!!sym(column_to_look) == "P321LM000011")%>%
collect()
使用 glue_sql
而不是 paste0