【问题标题】:%in% operator not operating as expected with reactive statement of a Shiny app%in% 运算符未按预期使用 Shiny 应用程序的反应语句运行
【发布时间】:2022-12-03 05:33:51
【问题描述】:

我有一个闪亮的应用程序,它获取一个数据集并通过多个用户输入对其进行过滤。为此,我使用 selectizeInput 函数,用户可以在其中从列表中选择一个或多个选项,然后通过反应语句运行这些选择以获得所需的最终数据集。我最近注意到,这不再适用于我托管该应用程序的地方之一;这个应用程序是用 Shiny 1.6.0 构建和部署的,它仍在那个位置工作,但它在另一个有 Shiny 1.7.3 的地方不工作。我想知道这是否可能是较新版本的 Shiny 的问题。这是一个示例,其中多项选择导致结果表未填充:

library(shiny)
library(dplyr)

data <- mtcars

ui <- fluidPage(
                fluidRow(
                  column(width = 4, wellPanel(
                    selectizeInput("carb", "carb:", c("All", sort(unique(data$carb))), 
                                   selected = "All", multiple = TRUE,
                                   options = list('plugins' = list('remove_button'), 
                                                  'create' = TRUE, 'persist' = FALSE)))),
                  column(width = 8, wellPanel(tableOutput("table")))
                  )
                )


server <- function(input,output,session){
  process <- reactive({
    req(input$carb) # require some input
    if(input$carb == "All"){data} #pass entire dataset if selected
    else(data %>% dplyr::filter(carb %in% input$carb))}) # will not work with > 1 selected

  output$table <- renderTable({process()})
}

shinyApp(ui = ui, server = server)

只选择一个值可以让一切正常工作,但如果选择多个值,则会出现关于长度 > 1 的条件的错误。以前当这个工作时,我能够为 carb 变量选择类似 1,2 和 4 的东西,结果表将显示具有这三个值之一的所有行。我知道通过在服务器中添加 renderTable 语句,输入被传递到参数:

output$test <- renderTable({as.data.frame(input$carb)})

但是,当我尝试过滤完整数据集时,这不起作用。我可以在 selectizeInput(multiple = FALSE) 时运行所有内容,但理想情况下它应该等于 TRUE,以便用户拥有更多功能。

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    问题不在于filter 中的%in%。问题出在下面的语句中

    if(input$carb == "All") {data}
    

    如果您希望 carb 允许多个值,则不能仅使用“All”来测试是否相等。如果您想测试所选选项中是否全部包含,请改用类似这样的东西

    if("All" %in% input$carb) {data}
    

    【讨论】:

      【解决方案2】:

      错误来自input$carb == "All"。一旦你输入多个元素,它就会产生一个相同长度的向量。你可以尝试其中之一:

      if (all(input$carb == "All")) # shows all rows if Only All is selected
      OR
      if ("All" %in% input$carb)) # shows all rows as soon as All is selected
      

      此外,您必须在 else 中使用大括号。在这里并不重要,只是为了语法一致性

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多