在shinydashboard中使用selectInput时出现 "参数1为空 "的错误。

问题描述 投票:1回答:1

我有一个像下面这样的闪亮的应用程序,使用 diamonds 数据集为例。我使用两个selectInput作为数据过滤器。第一个选择一个变量。第二条显示数值,取决于第一个selectInput中选择的变量。选择后,点击actionButton来触发过滤器。在没有选择任何变量和值的情况下,我希望它输出整个数据集。

我发现当我清除了两个selectInput,然后点击actionButton后,我得到了错误。argument 1 is empty. 我不明白为什么会发生这种情况。花了几个小时,但无法找到解决方案。有谁知道我怎么能解决这个问题吗? 非常感谢!我有一个像下面这样的闪亮的应用程序。

library(shiny)
library(shinydashboard)
library(dplyr)
library(rlang)

data(diamonds)

df = diamonds[1:1000,]

subset_data = function(data,
                       var=NULL,
                       value=NULL){

    if (!is.null(var)) {
        if(!is.null(value)) {
            data = data %>% filter(!!sym(var) == value)
        }
    }

    return(data)
}

ui <- dashboardPage(
    dashboardHeader(title = "example"),
    dashboardSidebar(),
    dashboardBody(
        fluidRow(


            selectizeInput(inputId = 'var', 
                           label='Select variable',
                           choices = c('cut', 'color'), 
                           multiple=FALSE,
                           options = list(
                               maxItems = 1,
                               placeholder = '',
                               onInitialize = I("function() { this.setValue(''); }"))),

            uiOutput("valueUI"),
            actionButton('go', 'apply filter'),

            tableOutput('table')
        )
    )
)

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

    output$valueUI = renderUI({

        if (input$var == '') {
            vals = '' 
        }
        if (input$var == 'cut') {
            vals = c('Premium', 'Good', 'Very Good', 'Fair')  
        }
        if (input$var == 'color'){
            vals = c('E', 'J', 'I', 'H')
        }

        selectizeInput(inputId = 'value', 
                       label='Select values',
                       choices = c('',vals), 
                       multiple=FALSE,
                       options = list(
                           maxItems = 1,
                           placeholder = '',
                           onInitialize = I("function() { this.setValue(''); }")))

    })

    dat = reactive({
        input$go

        isolate( subset_data(data=df, var=input$var, value=input$value) )
    })

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

shinyApp(ui, server)
r shiny shinydashboard
1个回答
1
投票

如果 input$var 未给定,将用 '' 正如你所实现的那样。

但是,同时它也会给出参数 var 价值 subset_data 作为 ''NULL,所以它将不被识别与 !is.null(var) 和触发 filter 对于 data .

如果你像下面的代码一样修改subset_data,你可以看到这些解释。

subset_data = function(data,
                       var=NULL,
                       value=NULL){
  print('var:')
  print(var) # var is given as ''
  print("value:")
  print(value)
  if (!is.null(var)) {
    if(!is.null(value)) {
      print('hi')
      data = data %>% filter(!!sym(var) == value)
      print('hi2') # this will not printed, since filter makes error.
    }
  }

  return(data)
}

所以在这种情况下,你可以通过在subset_data上添加一行来修正它们,以检查是否有 var == ''.

if( var == '' ) return(data)

谢谢。

© www.soinside.com 2019 - 2024. All rights reserved.