下面的简化代码允许用户下载("保存")用户输入,并在以后使用上传操作按钮检索它们.下面的图片显示了这个应用程序是如何工作的.问题是有两个输入变量相互作用:来自sliderInput()
的time_window
和用户输入到称为matInput()
的2列输入矩阵中的输入.如果用户保存了输入,例如在另一个会话中将time_window
设置为5,并try 检索已保存的场景,其中time_window
设置为10,则需要单击两次Upload操作按钮才能检索已保存的场景:第一次点击从保存的场景中检索sliderInput()
值10,第二次点击检索保存的matInput()
对象中的值.你可以在代码中看到,在downloadHander()
中,我把两个输入分组为saveRDS(list(var_1_input = input$var_1_input, time_window = input$time_window)
,在observe()
中,我把这些输入分组为updateSliderInput(session, "time_window", value = uploaded_values$time_window) updateMatrixInput(session, "var_1_input", value = uploaded_values$var_1_input)
;但是这不能同时检索和处理输入.
那么,当上传保存的输入时,如何通过一次操作按钮同时访问和处理它们呢?
代码:
library(shiny)
library(shinyMatrix)
matInput <- function(name, x) {
matrixInput(
name,
value = matrix(c(x, 0), 1, 2, dimnames = list(NULL, c("X", "Y"))),
rows = list(extend = TRUE, names = FALSE),
cols = list(extend = TRUE, delta = 0, names = TRUE, editableNames = FALSE),
class = "numeric"
)
}
matStretch <- function(mat, time_window, col_name) {
mat[, 1] <- pmin(mat[, 1], time_window)
df <- data.frame(matrix(0, nrow = time_window, ncol = 1, dimnames = list(NULL, col_name)))
df[, col_name] <- ifelse(seq_along(df[, 1]) %in% mat[, 1], mat[match(seq_along(df[, 1]), mat[, 1]), 2], 0)
return(df)
}
ui <- fluidPage(
actionButton('modal_upload', 'Upload'),
downloadButton("save_btn", "Save"),
sliderInput("time_window","Time window (W):", min = 1, max = 10, value = 10),
uiOutput("Vectors"),
tableOutput("table2")
)
server <- function(input, output, session) {
time_window <- reactive(input$time_window)
output$Vectors <- renderUI({matInput("var_1_input", input$time_window)})
output$save_btn <- downloadHandler(
filename = function() paste0("scenario", ".rds"),
content = function(file) saveRDS(list(var_1_input = input$var_1_input, time_window = input$time_window), file)
)
observeEvent(input$modal_upload, {
showModal(modalDialog(fileInput("upload_file_input", "Upload:", accept = c('.rds'))))
})
observe({
if (!is.null(input$upload_file_input)) {
uploaded_values <- readRDS(input$upload_file_input$datapath)
updateSliderInput(session, "time_window", value = uploaded_values$time_window)
updateMatrixInput(session, "var_1_input", value = uploaded_values$var_1_input)
removeModal()
}
})
var_1 <- reactive(input$var_1_input)
output$table2 <- renderTable(matStretch(var_1(), time_window(), "Var_1"))
}
shinyApp(ui, server)