Рассмотрим следующий MWE:
library(shiny)
library(shinyjs)
library(shinymaterial)
library(data.table)
ui <- material_page(include_nav_bar = F,
material_row(id = "data-actions",
material_column(width = 4, material_card(title = "Spalten umbenennen", divider = TRUE,
material_dropdown(input_id = "renameOldColName", choices = NULL, label = "Spalte"),
material_text_box(input_id = "renameNewColName", label = "Neuer Name"),
material_button(input_id = "renameColumn", label = "Umbenennen"))),
),
material_row(id = "data-preview",
material_column(width = 12, material_card(title = "Vorschau", uiOutput("overview")))
))
server <- function(input, output, session) {
state <- reactiveValues()
state$data <- setDT(mtcars)
# Render datatable ui
output$overview <- renderUI({
validate(need(state$data, message = "Keine Vorschau verfügbar"))
DT::dataTableOutput("overviewTable")
})
# Render datatable itself if data is available
output$overviewTable <- DT::renderDataTable({
state$data
})
# Rename columns
observeEvent(state$data, {
update_material_dropdown(session = session, "renameOldColName", choices = colnames(state$data), value=colnames(state$data)[1])
})
observeEvent(input$renameColumn, {
req(input$renameNewColName, input$renameOldColName)
setnames(state$data, old = (input$renameOldColName), new = (input$renameNewColName))
})
}
viewer <- browserViewer()
runGadget(ui, server, viewer = viewer)
Это приложение позволяет вам переименовать столбец таблицы данных. Моя проблема в том, что это изменение не отражается в обновленном выводе данных.
Использование подхода dplyr
с state$data %<>% rename(...)
работает, но DT::setnames
работает с указателями, я думаю.
Поскольку мой реальное приложение выполняет множество различных действий с таблицами данных с более чем 300 тыс. строк, я бы предпочел использовать data.table
вместо dplyr
.