下面的简化代码允许用户下载("保存")用户输入,并在以后使用上传操作按钮检索它们.下面的图片显示了这个应用程序是如何工作的.问题是有两个输入变量相互作用:来自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);但是这不能同时检索和处理输入.

那么,当上传保存的输入时,如何通过一次操作按钮同时访问和处理它们呢?

enter image description here

代码:

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)

推荐答案

服务器代码采用一种更直接的方法来确保output$个变量不会被后续的react 覆盖:

server <- function(input, output, session) {
  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)
      output$Vectors <- renderUI({matInput("var_1_input", uploaded_values$time_window)})
      output$table2 <- renderTable(matStretch(uploaded_values$var_1_input, uploaded_values$time_window, "Var_1"))
      removeModal()
    }
  })
  
  output$table2 <- renderTable(matStretch(input$var_1_input, input$time_window, "Var_1"))
}

R相关问答推荐

查找具有平局的多个列的最大值并返回列名或平局 destruct 者NA值

管道末端运行功能

R Markdown中的交叉引用表

根据R中两个变量的两个条件删除带有dspirr的行

R Tidymodels textercipes-使用spacyR进行标记化-如何从生成的标记列表中删除标点符号

为什么当用osmdata映射R时会得到相邻状态?

非线性混合效应模型(NLME)预测变量的置信区间

R spatstat Minkowski Sum()返回多个边界

计算直线上点到参考点的总距离

是否可以将线性模型的p值添加到tbl_summary中

从线的交点创建面

按两个因素将观测值分组后计算单独的百分比

如何判断代码是否在R Markdown(RMD)上下文中交互运行?

用满足特定列匹配的另一行替换NA行

如何在内联代码中添加额外的空格(R Markdown)

如果极点中存在部分匹配,则替换整个字符串

从两个数据帧中,有没有办法计算R中一列的唯一值?

删除r中每个因素级别的最后2行

如何修改Rust中的R字符串并将其赋给新的R变量,并使用extendr保留原始R字符串

Data.table条件合并