Получил «аргумент 1 - пустая ошибка» с selectInput в shinydashboard - PullRequest
1 голос
/ 24 апреля 2020

У меня блестящее приложение, как показано ниже, использующее набор данных diamonds в качестве примера. Я использую два selectInput в качестве фильтра данных. Первый выберите переменную. Второй показывает значения в зависимости от переменной, выбранной в первом selectInput. После выбора нажмите кнопку actionButton, чтобы активировать фильтр. Без какой-либо переменной и выбранного значения, я хочу, чтобы он вывел весь набор данных.

Я обнаружил, что после того, как я очистил два selectInput и затем нажал кнопку action, я получил ошибку: 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)

1 Ответ

1 голос
/ 24 апреля 2020

если input$var не задано, он будет обработан с '', как вы реализовали.

Однако, в то же время он также даст значение параметра var в функции subset_data как '' not 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)
}

, поэтому в этом случае вы можете исправить их, добавив всего 1 строку в subset_data, чтобы проверить, * var == ''.

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

С уважением.

...