Итак, у меня есть блестящее приложение, в котором я хочу редактировать значения в таблице. Теперь, когда я использую фактические данные df
для редактирования таблиц, это работает. Но я хочу использовать данные из моего reactiveValues
(v$data
), которые я использую для отображения таблицы и использовать их при нажатии на кнопку сброса. Можно ли использовать реактивные значения в таблице данных.
library(shiny)
library(dplyr)
library(DT)
input_data <- data.frame(Channel = c("A", "B","C"),
lower_rate = c (.5, .5, .5),
lower_current = c(2000, 3000, 4000),
New_Membership = c(450, 650,700),
stringsAsFactors = FALSE) %>%
mutate(lower_bound = lower_current * lower_rate)
optimzation <- function(input, output, session, data,budget,run,reset) {
v <- reactiveValues(data = data)
observeEvent(run(), {
v$data <- data %>% mutate(opt = lower_current * budget())
})
proxy = dataTableProxy("mod_table")
observeEvent(input$mod_table_cell_edit, {
info = input$mod_table_cell_edit
str(info)
i = info$row
j = info$col
k = info$value
if (j %in% match(c("lower_rate", "lower_bound"), names(df))) {
df[i, j] <<- DT::coerceValue(k, df[i, j])
if (j %in% match("lower_bound", names(df))) {
df$lower_rate <<- df$lower_bound / df$lower_current
}
if (j %in% match("lower_rate", names(df))) {
df$lower_bound <<- df$lower_current * df$lower_rate
}
} else {
stop("You are not supposed to change this column.")
}
replaceData(proxy, df, resetPaging = FALSE) # important
})
observeEvent(reset(), {
v$data <- data # your default data
})
output$mod_table <- DT::renderDataTable({
DT::datatable(v$data, editable = TRUE)
})
}
optimzationUI <- function(id) {
ns <- NS(id)
DT::dataTableOutput(ns("mod_table"))
}
shinyApp(
ui = basicPage(
mainPanel(
numericInput("budget_input", label = h5("Total Budget"), value = 9000000),
actionButton("opt_run", "Run"),
actionButton("opt_reset", "Reset"),
tags$hr(),
optimzationUI("optimize")
)
),
server = function(input, output) {
demodata<-input_data
callModule(optimzation,"optimize", demodata,
budget = reactive(input$budget_input),
run = reactive(input$opt_run),
reset = reactive(input$opt_reset))
}
)