У меня блестящее приложение, в котором я хочу, чтобы пользователь мог выбрать, какие переменные оставить в конечном кадре данных, а затем также выбрать, какие переменные масштабировать до процента.У меня это работает, но я сталкиваюсь с небольшой загадкой.Проблема в том, что если пользователь решит, что он хочет добавить дополнительную переменную (или удалить одну), он должен повторить масштабирование.Это может быть проблемой, если у моих пользователей много столбцов, над которыми они работают.Как я могу сохранить работу по масштабированию, которую уже проделал пользователь, допуская добавление или удаление переменных из окончательного фрейма данных?
library(shiny)
library(tidyverse)
library(DT)
# Define UI
ui <- fluidPage(
checkboxGroupInput("select_var", label = "Select Variables"),
selectInput("scalescore", label = NULL, choices = c("")),
actionButton("scale", "Scale Scores"),
DT::dataTableOutput("table")
)
# Define server
server <- function(session, input, output) {
# define the reactive values
values <- reactiveValues(df_final = NULL)
# dynamically generate the variable names
observe({
vchoices <- names(mtcars)
updateCheckboxGroupInput(session, "select_var", choices = vchoices)
})
# dynamically generate the variables to scale
observe({
vchoices <- names(values$df_final)
updateSelectInput(session, "scalescore", choices = vchoices)
})
# select the variables based on checkbox
observe({
req(input$select_var)
df_sel <- mtcars %>% select(input$select_var)
values$df_final <- df_sel
})
observeEvent(input$scale, {
name <- rlang::sym(paste0(input$scalescore, "_scaled"))
values$df_final <- values$df_final %>% mutate(!!name := round(!!rlang::sym(input$scalescore)/max(!!rlang::sym(input$scalescore), na.rm = TRUE)*100, 1))})
output$table <- DT::renderDataTable(values$df_final)
}
# Run the application
shinyApp(ui = ui, server = server)