Блестящий Selectinput для каждого нечислового c столбца данных Filteinput - PullRequest
1 голос
/ 08 мая 2020

Я хотел бы создать блестящую панель управления, где: 1) пользователь выбирает файл Excel 2) создается опция Selectinput для каждого нечислового c столбца полученного фрейма данных, что дает пользователям возможность для выбора каждого уникального значения в этом столбце. Вот как выглядит мой код на данный момент:

library(shiny)
library(dplyr)
library(openxlsx)

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(

      fileInput('datafile', 'Choose xlsx file',
                accept = c(".xlsx")),

      lapply(names("varselect"), function(i) {
        selectInput(paste0(i), paste0(i),
                    choices = "varselect"[i],
                    multiple = TRUE,
                    selected = "")})),
    mainPanel()))


server <- function(input, output,session) {
    Data <- reactive({
    infile <- input$datafile
    if (is.null(infile)) {
      return(data.frame())
    }
    read.xlsx(infile$datapath, 
              sheetIndex = 1) %>% select_if(colSums(!is.na(.)) > 0%>% select_if(~!is.numeric(.x)) %>% head()) 

  })

  output$varselect <- renderUI({

  })


  observe({
    lapply(names(Data()), function(i) {
      selectInput(paste0(i), paste0(i),
                  choices = Data()[i],
                  multiple = TRUE,
                  selected = "")})})


}


shinyApp(ui = ui, server = server)

Я знаю, что код не работает и есть серьезные ошибки, но я надеюсь, что кто-то может помочь мне найти подход это действительно работает для этой проблемы. Я новичок в Шинни, и поэтому я, честно говоря, понятия не имею, как решить эту проблему.

Большое спасибо.

1 Ответ

2 голосов
/ 08 мая 2020

В свой ui вы можете включить uiOutput, который будет содержать все динамически созданные selectInput виджеты.

Затем в output$varselect вы можете создать selectInput на основе количество столбцов в Data().

library(shiny)
library(dplyr)
library(openxlsx)

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      fileInput('datafile', 'Choose xlsx file',
                accept = c(".xlsx")),
      uiOutput("varselect")
    ),
    mainPanel()
  )
)

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

  Data <- reactive({
    infile <- input$datafile
    if (is.null(infile)) {
      return(data.frame())
    }
    read.xlsx(infile$datapath, sheet = 1) %>%
      select_if(colSums(!is.na(.)) > 0) %>%
      select_if(~!is.numeric(.x)) %>%
      head()
  })

  output$varselect <- renderUI({
    if (ncol(Data() > 0)) {
      lapply(1:ncol(Data()), function(i) {
        selectInput(inputId = paste0("si_", i), 
                    label = paste0("Input #", i),
                    choices = Data()[,i],
                    multiple = TRUE)
      })
    }
  })

}

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