Как заполнить параметры ввода для блеска, используя информацию с сервера - PullRequest
1 голос
/ 07 марта 2019

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

Пример кода:

ui <- fluidPage(
  sidebarPanel(
    selectInput(inputId = 'col1Input',
                label ='col1',
                choices = c(1,2,3))),
  mainPanel(
    DT::dataTableOutput("table")))
server <- function(input,output){
  df <- data.frame('col1' = c(1,2,3), 'col2' = c(1,2,3))
  output$table <- DT::renderDataTable(dplyr::filter(df, col1 == input$col1Input))
}

shinyApp(ui = ui, server = server)

Спасибо!

1 Ответ

2 голосов
/ 07 марта 2019

Вы можете использовать renderUI для создания пользовательского интерфейса на сервере.Тогда вы могли бы просто использовать один из столбцов из информационного фрейма, который у вас есть на сервере, для создания выбранного входа?

См. Здесь , чтобы узнать, как использовать renderUI.

ui <- fluidPage(
  uiOutput("sidebarOutput"),
  uiOutput("mainPanel")
)

server <- function(input,output){
  df <- data.frame('col1' = c(1,2,3), 'col2' = c(1,2,3))
  output$sidebarOutput <- renderUI({
    sidebarPanel(
      selectInput(inputId = 'col1Input',
                  label =colnames(df[1]),
                  choices = df[[1]]))
  })

  output$mainPanel <- renderUI({
      output$table <- DT::renderDataTable({
          validate(
            need(input$col1Input != "", "No column selected")
          )
          dplyr::filter(df, col1 == input$col1Input)
        })

      mainPanel(
        DT::dataTableOutput("table")
      )
  })
}

shinyApp(ui = ui, server = server)

Редактировать : Возможно, вы также захотите отфильтровать выбранный вами столбец.Вы можете сделать это так:

ui <- fluidPage(
  uiOutput("sidebarOutput"),
  uiOutput("mainPanel")
)

server <- function(input,output){
  df <- data.frame('col1' = c(1,2,3), 'col2' = c(4,5,6))
  output$sidebarOutput <- renderUI({
    sidebarPanel(
      selectInput(inputId = 'filtercolumn',
                  label = "Select a column to filter on",
                  choices = colnames(df)),

      renderUI({selectInput(inputId = 'valuetofilter',
                  label = paste0("filtering on column: ", colnames(df[input$filtercolumn])),
                  choices = df[[input$filtercolumn]])})
      )
  })

  output$mainPanel <- renderUI({
      output$table <- DT::renderDataTable({
          validate({
            need(input$filtercolumn != "", "No column selected")
            need(input$valuetofilter != "", "No value selected")
          })

          dplyr::filter(df,(!!as.name(input$filtercolumn)) == !!input$valuetofilter) #note the unquoting
        })

      mainPanel(
        DT::dataTableOutput("table")
      )
  })
}

shinyApp(ui = ui, server = server)

Благодаря this answer

...