У меня есть список l из data.frames, и я хочу динамически выбирать элементы с помощью selectInput.

Как только пользователь выберет элемент, я хотел бы иметь возможность работать с ним под капотом, например, использовать его в renderTable и вывести таблицу этого data.frame.

Более того, я хотел бы иметь возможность выбрать этот элемент в списке и, например, применить lm.

Проблема, с которой я столкнулся, заключается в следующем: l[[ElemInput()]] как преобразовать этот классический код R с реактивным элементом?

Вот полный shinydashboard:

library(shiny)
library(shinydashboard)


ui <- dashboardPage(
  dashboardHeader(
    title = "My Dashboard"
  ),
  dashboardSidebar(
    sidebarMenu(
      menuItem("aaa", tabName = "aaa", icon = icon("dashboard"))
    )
  ),
  dashboardBody(
    tabItems(
      # First tab content
      tabItem(tabName = "aaa",
              h2("Dashboard aaa"),
              fluidRow(
                box(
                    selectInput("input_name", "Select input:", choices = names(l))
                ),
                box(
                  dataTableOutput('table')
                )
              )
      )
    )
  )
)

server <- function(input, output) { 
  # create a fake list 
  set.seed(123)
  l <- list(element1 = data.frame(aaa=1:5, bbb=sample(5)),
            element2 = data.frame(ccc=6:10, ddd=sample(5)))

  # reactive read element
  ElemInput <- reactive({
    input$input_name
  })

  # render table
    output$table <- renderTable({
      l[[ElemInput()]] #  this part doesn't work
    })

}

shinyApp(ui, server)

Возможно, коррелированные вопросы, но я не мог найти решения для своего случая:

динамически выводить список вариантов для selectInput из столбца, выбранного пользователем

Сохранить selectInput в строковом / символьном объекте

2
RLave 5 Дек 2018 в 13:07

1 ответ

Лучший ответ

Вы должны использовать renderTable с tableOutput в своем ui. Так что измените dataTableOutput('table') на tableOutput('table').

Вы можете использовать dataTableOutput, если используете renderDataTable.

Также я предпочитаю использовать наблюдателя вместо реактивной функции. Это немного легче читать.

server <- function(input, output) { 
  observeEvent(input$input_name,{
    # observe element change and render table
    output$table <- renderTable({
      data.frame(l[[input$input_name]])
    })
  })
}
1
Wilmar van Ommeren 5 Дек 2018 в 10:16