首页 > 解决方案 > Shiny App 未使用 dplyr 和 %in% 运算符进行过滤

问题描述

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

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 不能正常工作。

谢谢!

标签: rdplyrshiny

解决方案


我们可以根据要求将所有输入更改ifelse为相同的长度,而返回单个 TRUE/FALSE。因此,最好使用. 此外,调用inside也不是正确的方法,因为它改变了参数的长度if/elseifelseis.nullif/elseuniqueifelse

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()

})
}

-输出

在此处输入图像描述


推荐阅读