Готовлю блестящую аппликацию. У меня есть несколько фреймов данных, в которых я храню данные о населении с разбивкой по годам. Так, например, table_2017 хранит данные за 2017 год, table_2018 данные за 2018 год и т. Д.

Я хотел бы отобразить все данные в таблице и позволить пользователю выбрать год, который его интересует. Я подумал, что подготовлю радиокнопки, и таким образом пользователь будет выбирать, какой год ему интересен.

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

"данные" должны быть двумерными (например, фрейм данных или матрица) .

Отсюда мой вопрос: как я могу обновить datatable после выбора источника данных с помощью кнопки радио? Может быть, для этого есть какие-нибудь готовые инструменты (например, updatemenus для plotly)?

Это пример:

library(shiny)
library(DT)

ui <- fluidPage(
    
    radioButtons("years", "Choose year", inline = TRUE,
                 c("2017" = "table_2017",
                   "2018" = "table_2018",
                   "2019" = "table_2019")),
    DT::dataTableOutput("table")
       
)


server <- function(input, output) {
    
    a <- c("Region1","Region2","Region3","Region4")
    b <- c(100, 200, 300, 400)
    table_2017 <- data.frame(a,b)
    names(table_2017) <- c('Name', 'Population')
    
    c <- c("Region1","Region2","Region3","Region4")
    d <- c(500, 600, 700, 800)
    table_2018 <- data.frame(c,d)
    names(table_2018) <- c('Name', 'Population')
    
    e <- c("Region1","Region2","Region3","Region4")
    f <- c(900, 1000, 1100, 1200)
    table_2019 <- data.frame(e,f)
    names(table_2019) <- c('Name', 'Population')

    output$table <- DT::renderDataTable({
        
        data <- input$years
        datatable(data)
                        
        
    })
}


shinyApp(ui = ui, server = server)
0
blueberry40 3 Дек 2020 в 13:55

1 ответ

Лучший ответ

Это действительно просто, просто добавьте get(data))

Проблема заключалась в том, что input$years из ваших переключателей был просто вектором символов, который не исполняется DT::datatable. С get() вы получаете доступ к среде R и оцениваете фрейм данных, а не вектор символов в datatable.

Ваш вывод таблицы тогда

  output$table <- DT::renderDataTable({
    
    data <- input$years
    datatable(get(data))
    
    
  })

Кстати, вы должны выполнять весь статический код R за пределами вашего блестящего приложения. Переместите фреймы данных за пределы серверной функции или в файл global.R

1
Thomas 3 Дек 2020 в 11:11