【问题标题】:Shiny App not filtering using dplyr and %in% operatorShiny App 未使用 dplyr 和 %in% 运算符进行过滤
【发布时间】:2020-11-27 19:57:38
【问题描述】:

我正在使用菱形数据集制作一个应用程序,除非选择输入,否则我想显示完整的表格。但是,如果我选择,比如说,自己剪切,什么都不会出现。此外,如果我选择了很多东西,则不会出现额外的钻石。这是我的代码:

library(shiny)
library(DT)
library(tidyverse)

diamonds <- diamonds

#Shiny App

ui = fluidPage(
    fluidRow(
        column(2, selectizeInput(inputId = 'carat',
                                 label = 'Select carat',
                                 choices = unique(diamonds$carat),
                                 selected = NULL,
                                 multiple=TRUE)),
        column(2, selectizeInput(inputId = 'cut',
                                 label = 'Select cut',
                                 choices = unique(diamonds$cut),
                                 selected = NULL,
                                 multiple=TRUE)),
        column(2, selectizeInput(inputId = 'color',
                                 label = 'Select color',
                                 choices = unique(diamonds$color),
                                 selected = NULL,
                                 multiple=TRUE))
    ),
    fluidRow (
        column(12, dataTableOutput('data', height = '100px') ) 
    )           
)

server <- function(input, output, session) {

    df_current <- reactive({
        df <- diamonds%>% 
            filter(carat %in% ifelse(is.null(input$carat), carat, input$carat),
                   cut %in% ifelse(is.null(input$cut), color, input$cut),
                   color %in% ifelse(is.null(input$color), color, input$color))

        df

    })

    output$data <- renderDataTable({

        df_current()

    })
    }



    shinyApp(ui = ui, server = server)

我不确定为什么反应函数 df_current 不能正常工作。

谢谢!

【问题讨论】:

    标签: r dplyr shiny


    【解决方案1】:

    我们可以将 ifelse 更改为 if/else,因为 ifelse 要求所有输入的长度相同,而 is.null 返回单个 TRUE/FALSE。所以,最好使用if/else。另外,在ifelse 中调用unique 也不是正确的方法,因为它会改变参数的长度

    server <- function(input, output, session) {
       df_current <- reactive({
        df <- diamonds%>% 
            filter(carat %in% if(is.null(input$carat)) carat else input$carat,
                   cut %in% if(is.null(input$cut)) cut else input$cut,
                   color %in% if(is.null(input$color)) color else input$color)
    
        df
    
         })
    
      output$data <- renderDataTable({
    
        df_current()
    
    })
    }
    

    -输出

    【讨论】:

      【解决方案2】:

      问题是ifelse 没有正确处理因子变量并返回因子水平的数字而不是因子水平。您可以使用as.character 来规避此问题。另外,我使用了unique,因为您不需要完整的列作为返回值。

      第二个问题是您在过滤cut 时出现拼写错误,因为您使用color 而不是cut 作为返回值。

      server <- function(input, output, session) {
        
        df_current <- reactive({
          
          df <- diamonds%>% 
            filter(carat %in% ifelse(is.null(input$carat), unique(carat), input$carat),
                   cut %in% ifelse(is.null(input$cut), as.character(unique(cut)), input$cut),
                   color %in% ifelse(is.null(input$color), as.character(unique(color)), input$color))
          
          df
          
        })
        
        output$data <- renderDataTable({
          
          df_current()
          
        })
      }
      

      【讨论】:

        猜你喜欢
        • 2015-06-07
        • 2018-07-03
        • 2018-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多