【问题标题】:Shiny pass input into dbplyr filter pipe闪亮的传递输入到 dbplyr 过滤器管道
【发布时间】:2021-06-29 08:59:38
【问题描述】:

我正在尝试使用文本输入来过滤闪亮仪表板中的 postgre 表。我需要过滤从 selectinput 中选择的某个列。问题是表的列名以“_”开头,即“_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()

其中 input$column_to_look 是一个数字 (7),字符串 column_to_look 变为“_7_track”。

我得到一个 0*0 的表,如果我要求查询翻译是:

db_tracing %>% show_query()

<SQL>
SELECT *
FROM "r_tracing_mfg"
WHERE ('_7_track' = 'P321LM000011')

DBeaver(我用来处理 db)生成以下查询: 选择 * FROM r_tracing_mfg
WHERE "_7_track" = 'P321LM000011'

行得通。

如果我直接在 dbplyr 的管道中输入此代码:

db_tracing<-dplyr::tbl(dbDataCon,'r_tracing_mfg') %>% 
      filter(`_7_track` == "P321LM000011") %>%
      collect()

请求有效,我获得了一个包含 n*n 匹配观察的表。在这种情况下 show_query() 给了我:

<SQL>
SELECT *
FROM "r_tracing_mfg"
WHERE ("_7_track" = 'P321LM000011')

那么我怎样才能重现这第二种行为呢?我试过了,当然是徒劳的,

paste0("`_",input$column_to_look,"_track`") 

【问题讨论】:

    标签: r shiny dbplyr


    【解决方案1】:

    我认为将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

    【讨论】:

      猜你喜欢
      • 2018-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-18
      • 2015-01-19
      • 1970-01-01
      • 2018-08-09
      • 2015-11-15
      相关资源
      最近更新 更多