微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

进入 dbplyr 过滤器管道的闪亮传递输入

如何解决进入 dbplyr 过滤器管道的闪亮传递输入

我正在尝试使用文本输入来过滤闪亮仪表板中的 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(我用来处理数据库的)生成这个查询: 选择 * 从 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("`_","_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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。