Динамически отображать имена столбцов в блестящем приложении мигает ошибка при изменении набора данных - PullRequest
0 голосов
/ 22 февраля 2019

У меня блестящее приложение, в котором я хочу позволить пользователю выбрать набор данных на основе набора загруженных файлов, а затем указать столбцы для отображения из выбранного набора данных.Если я оставлю некоторые столбцы выбранными, а затем переключу наборы данных, на консоль будет мигать сообщение об ошибке, сообщающее, что выбранные столбцы неизвестны, прежде чем приложение переключит наборы данных и отобразит его правильно.Однако в моем полном приложении оно вылетает, хотя я не смог понять, как воспроизвести сбой.Я подумал, что это может быть связано с некоторой предварительной обработкой, которая выполняется для добавления дополнительных столбцов, которые одинаковы в наборах данных и которые остаются выбранными, но ошибка та же без этой функции.

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


ui <- fluidPage(
  checkboxGroupInput("select_var", label = "Select Variables"),
  selectInput("dataset", label = NULL, choices = c("mtcars", "rock")),
  DT::dataTableOutput("table")

)


server <- function(session, input, output) {
  # define the dataset
  data <- reactive({switch(input$dataset,"rock" = rock,"mtcars" = mtcars)})

  # add a common column name that is always selected
  dataprocessed <- reactive({data <- data()
                             data$num <- seq(1:nrow(data))
                             return(data)})

  # dynamically generate the variable names
  observe({
    vchoices <- names(dataprocessed())
    updateCheckboxGroupInput(session, "select_var", choices = vchoices, selected = c("num"))
  })

  # select the variables based on checkbox
  data_sel <- reactive({
    req(input$select_var)
    df_sel <- dataprocessed() %>% select(input$select_var) 
      })

  output$table <- DT::renderDataTable(data_sel())
}

# Run the application 
shinyApp(ui = ui, server = server)

1 Ответ

0 голосов
/ 22 февраля 2019

Мы можем добавить условное требование, используя req() для проверки существования столбца перед рендерингом:

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

ui <- fluidPage(
  checkboxGroupInput("select_var", label = "Select Variables"),
  selectInput("dataset", label = NULL, choices = c("mtcars", "rock")),
  DT::dataTableOutput("table")

)

server <- function(session, input, output) {
  # define the dataset
  data <- reactive({
    switch(input$dataset,"rock" = rock,"mtcars" = mtcars)
  })

  # add a common column name that is always selected
  dataprocessed <- reactive({
    data <- data()
    data$num <- seq(1:nrow(data))
    return(data)
  })

  # dynamically generate the variable names
  observe({
    vchoices <- names(dataprocessed())
    updateCheckboxGroupInput(session, "select_var", choices = vchoices, selected = c("num"))
  })

  # select the variables based on checkbox
  data_sel <- reactive({
    req(input$select_var)
    req(names(dataprocessed()) %in% input$select_var)
    a <- names(dataprocessed())[names(dataprocessed()) %in% input$select_var]
    df_sel <- dataprocessed() %>% select(a) 
  })

  output$table <- DT::renderDataTable(data_sel())
}

# Run the application 
shinyApp(ui = ui, server = server)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...