多个 selectInput 值会产生意外的 dplyr (postgres) 行为

2024-01-12

我有一个可爱的闪亮应用程序,它接受 selectInput 值,查询 postgres 数据库,并输出一个图表。 (这是一个简单的界面,但由于 dplyr 数据库连接,很难在这里重现!)

今天我将第一个 selectInput 值更改为 multiple=TRUE;将传递到数据库的变量更新为修改后的控件返回的列表的%in%;一切都崩溃了。

  1. 在我选择一个值之前,控件为空,因此我看到闪亮的红色“错误:RS-DBI 驱动程序...”,告诉我我的查询“IN ()”无效
  2. 当仅选择一个值时,我收到语法错误,“”locationID“IN 'A1080330'”
  3. 我可以通过在返回的列表中加上括号来解决这个问题...... 位置ID %in%(输入$rtnLocid)
  4. 然而,当我选择多个列表项时,由于添加了括号,这会产生一个新的“运算符不存在”错误:“ IN (('A1080330', 'B...'))

我认为发生的事情是 postgres 驱动程序在使用 IN 时总是希望将 SQL 列表值放在括号中(有些数据库在这里可能更宽松);添加括号修复第一个选择;当多选打开时,添加的括号会再次破坏 postgres 驱动程序。

其他使用 Shiny / postgres 的人可以验证此行为吗?

问候, 杰夫

更新:@Steven 在评论中指出了我在发布时没有找到的信息链接:https://github.com/hadley/dplyr/issues/511 https://github.com/hadley/dplyr/issues/511


问题是当您仅选择时构造查询的方式one元素并使用IN操作员。这dplyr翻译为SQL没有添加正确的括号,因此失败。这个问题被详细讨论过here https://github.com/hadley/dplyr/issues/511.

解决此问题的一种方法是将不同的指令传递给filter() when length输入等于 1(参见下面的示例)。


这是正在发生的事情:

tbl(mydb, "iris") %>%
  filter(Species %in% c("setosa", "versicolor")) %>%
  .$query

给出适当的SQL查询语法:

<Query> SELECT "Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width", "Species"
FROM "iris"
WHERE "Species" IN ('setosa', 'versicolor')
<PostgreSQLConnection>

并且,如果执行,会给出预期的结果:

#Source: postgres 9.3.13 [[email protected] /cdn-cgi/l/email-protection:5432/csvdump]
#From: iris [100 x 5]
#Filter: Species %in% c("setosa", "versicolor") 
#
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#          (dbl)       (dbl)        (dbl)       (dbl)   (chr)
#1           5.1         3.5          1.4         0.2  setosa
#2           4.9         3.0          1.4         0.2  setosa
#3           4.7         3.2          1.3         0.2  setosa
#4           4.6         3.1          1.5         0.2  setosa
#5           5.0         3.6          1.4         0.2  setosa
#6           5.4         3.9          1.7         0.4  setosa
#7           4.6         3.4          1.4         0.3  setosa
#8           5.0         3.4          1.5         0.2  setosa
#9           4.4         2.9          1.4         0.2  setosa
#10          4.9         3.1          1.5         0.1  setosa
#..          ...         ...          ...         ...     ...

让我们看看如果您尝试传递单个元素会发生什么:

tbl(mydb, "iris") %>%
  filter(Species %in% "setosa") %>%
  .$query

查询将是:

<Query> SELECT "Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width", "Species"
FROM "iris"
WHERE "Species" IN 'setosa'
<PostgreSQLConnection>

如果执行,将导致以下错误:

postgresqlExecStatement(conn,语句,...)中的错误:RS-DBI 驱动程序:(无法检索结果:错误:语法错误或 靠近“'setosa'”第 3 行:“物种”IN 'setosa') AS“master” ^)

这是因为对于单个元素,dplyr翻译为SQL查询未添加正确的括号。注意它是怎样的'setosa'代替('setosa').

为了避免这种情况,我们可以这样做:

if(length(input$Species) == 1) { 
  tbl(mydb, "iris") %>% 
    filter(Species == input$Species) %>% 
}

这将构建一个语法上有效的SQL query:

<Query> SELECT "Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width", "Species" 
FROM "iris" 
WHERE "Species" = 'setosa' 
<PostgreSQLConnection>

以下示例可解决此问题。这里我只是简单的指示app通过filter(Species == ...) if input$Species is of length 1 and filter(Species %in% ...)否则。


ShinyApp

server <- function(input, output) {

  selectedQuery <- reactive({

    if(length(input$Species) == 1) { 
      tbl(mydb, "iris") %>% 
        filter(Species == input$Species) %>% 
        .$query
    }
    else(
      tbl(mydb, "iris") %>% 
        filter(Species %in% input$Species) %>% 
        .$query
      )

  })

  selectedData <- reactive({

    if(length(input$Species) == 1) {
      tbl(mydb, "iris") %>% 
        filter(Species == input$Species) %>% 
        data.frame
    }
    else(
      tbl(mydb, "iris") %>% 
        filter(Species %in% input$Species) %>% 
        data.frame
      )
  })

  output$plot <- renderPlot({
    ggplot2::qplot(Sepal.Length, Petal.Length, data = selectedData(), color = Species)
  })

  output$query <- renderPrint({
    selectedQuery()
    })
}

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      selectInput("Species", "Species", 
                  tbl(mydb, "iris") %>% 
                    data.frame %>% 
                    .$Species %>% 
                    unique, 
                  selected = "setosa", multiple = TRUE)
    ),
    mainPanel(
      textOutput("query"),
      plotOutput("plot")
      )
  )
)

shinyApp(ui = ui, server = server)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多个 selectInput 值会产生意外的 dplyr (postgres) 行为 的相关文章

随机推荐

  • 在 Groovy MarkupBuilder 中使用命名空间

    我想要有以下输出
  • 从 C# 列表中选择唯一元素

    如何从列表中选择独特的元素 0 1 2 2 2 3 4 4 5 这样我得到 0 1 3 5 有效去除的所有实例重复的元素 2 4 var numbers new 0 1 2 2 2 3 4 4 5 var uniqueNumbers fro
  • 如何使用 EWS 从 Outlook 联系人读取扩展属性

    我当前正在尝试通过 Microsoft 的 EWS 托管 API 从 Outlook 联系人对象读取某些属性 我从以下位置检索这些联系人对象FindItems 功能 其中一些字段是扩展属性 例如Title or User1领域 我很难阅读它
  • iOS 上 JavaScriptCore 虚拟机的强制垃圾回收

    有没有办法强制 iOS 或 Mac OS JavaScriptCore VM 垃圾收集器运行 我只需要它来测试内存泄漏 所以私有 API 就可以了 使用 JSBase h 中的以下函数 function JSGarbageCollect a
  • 哪些 Knockout.js 绑定是“双向”的?

    Knockout js 拥有双向绑定 并且实例展示 http knockoutjs com examples helloWorld html如何value绑定 当应用于文本输入时 更新视图模型 但是 我尝试更新其他绑定 例如text 发现视
  • Python二进制文件读取问题

    我正在尝试在 Python 中读取一个二进制文件 代表 Matlab 中的矩阵 但我在读取文件并将字节转换为正确的值时遇到问题 二进制文件由一系列 4 字节数字组成 前两个数字分别是行数和列数 我的朋友给了我一个他编写的 Matlab 函数
  • 为什么返回 Java 对象引用比返回原语慢得多

    我们正在开发一个延迟敏感的应用程序 并且一直在对各种方法进行微基准测试 使用jmh http openjdk java net projects code tools jmh 在对查找方法进行微基准测试并对结果感到满意后 我实现了最终版本
  • 如何在Azure Function App中禁用只读模式?

    我从 Azure 门户创建一个新的 Function App v2 然后 我借助 Azure Functions Core Tools v2 3 在本地计算机上启动一个新应用程序 并将其发布到门户上的新应用程序 func init func
  • 如何使用 PHP 从多列中选择最小值

    我有一个包含以下内容的表 6xx 8xx 9xx 11xx 12xx 1 0 01 0 002 0 004 0 001 0 025 2 0 025 0 125 0 002 0 01 0 011 我想找到该列中的最小值 使该列变为绿色 例如
  • 从整数创建 LocalDate 对象

    如果我已经有一个日期的月份 日期和年份作为整数 那么使用它们创建一个日期的最佳方法是什么 LocalDate目的 我找到了这个帖子字符串到本地日期 https stackoverflow com questions 8746084 stri
  • 在 Android 上访问高 fps 相机

    有些手机官方支持高 fps 录制 例如 Galaxy S5 和 S6 我尝试了两者 两者都可以使用默认相机应用程序录制高 fps 视频 60 甚至 120 fps 或者在 S6 上使用 Gear VR 的 直通相机 功能 但是 当您通过标准
  • 防止 PyQt 消除槽中发生的异常

    据我所知 如果 PyQt 下的插槽中发生异常 异常会打印到屏幕上 但不会冒泡 这在我的测试策略中产生了一个问题 因为如果某个槽中发生异常 我将不会看到测试失败 这是一个例子 import sys from PyQt4 import QtGu
  • 使用背景图像作为项目符号对齐中心列表项

    我已经尝试解决这个问题一个小时了 但找不到解决方案 我想要的是一个居中列表 背景图像为 刻度 我要这个 正常工作 除了点与列表左侧对齐之外ul 1140px 宽 而不是列表项的左侧li这是居中的 你可以使用CSS before伪类 ul l
  • 获取给定 DN 的 NT 样式域\用户

    我有 Active Directory 中用户的 DN 我想从中获取 NT 样式 域 用户 sAMAccountname AD 属性为我提供了用户部分 但是域呢 Thanks 您可以通过获取用户 DN 的最后部分 DC domain DC
  • 如何设置每 10 次触发 LLDB 断点?

    要调试高频计时器或传感器的值 配置一个仅每 x 次触发的断点会很有用 实现这一目标的最佳方法是什么 我在 Xcode 中尝试了 停止前忽略 x 次 选项 但这仅适用于第一次 我可以使用 LLDB 命令重置此计数器吗 您可以随时使用以下命令重
  • 子窗体定位如 StatusBar

    我有一个带有菜单栏和状态栏的 MDIForm 当我创建一个子窗体并将其定位为 Align alBottom 时 该窗体会离开屏幕区域 并且主窗体滚动条被激活 如何将子窗体定位在状态栏上方 对于没有父级负责显示它的控件 对齐和锚点并不能真正按
  • Swift - 在面部识别运行后,使用 Apple 登录始终会导致“注册未完成”

    我首先按照本教程使用 Firebase 设置 使用 Apple 登录 https medium com swift products sign in with apple with firebase authentication xcode
  • 针对动态变量的 If 语句[重复]

    这个问题在这里已经有答案了 我正在尝试做类似以下的事情 New Variable Name state name Value True if state name eq True Write Host Pass else Write Hos
  • css和xhtml中的每个元素和属性、属性是否有必要使用小写?

    4 2 元素和属性名称必须小写 XHTML 文档的所有 HTML 元素和属性名称必须使用小写 这种差异是必要的 因为 XML 区分大小写 例如 和 是不同的标签 来源 http www w3 org TR 2002 REC xhtml1 2
  • 多个 selectInput 值会产生意外的 dplyr (postgres) 行为

    我有一个可爱的闪亮应用程序 它接受 selectInput 值 查询 postgres 数据库 并输出一个图表 这是一个简单的界面 但由于 dplyr 数据库连接 很难在这里重现 今天我将第一个 selectInput 值更改为 multi