Блестящий динамически выделить элемент в списке и renderTable - PullRequest
0 голосов
/ 05 декабря 2018

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

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

* 1009.* Кроме того, я хотел бы иметь возможность выбрать этот элемент в списке и применить, например, 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 в строковом / символьном объекте

1 Ответ

0 голосов
/ 05 декабря 2018

Вы должны использовать 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]])
    })
  })
}
...