【问题标题】:Save changes to different datatables in Shiny在 Shiny 中保存对不同数据表的更改
【发布时间】:2020-05-19 17:30:27
【问题描述】:

我正在编写一个 Shiny 应用程序,它允许用户查看和更改多个数据框。最终,我希望更改覆盖原始数据帧中的值,以便可以在计算中使用它们。以下是我到目前为止所拥有的。我已经弄清楚如何允许用户在数据帧之间切换、更改 dfs 的值以及“重置”对 df1 和 df2 原始值的更改。但我想添加一个用用户更改覆盖 df1 和 df2 的 observeEvent。

library(shiny)
library(DT)
df1 <- data.frame(a = c('a','b','c','d','e'), 
                  b = round(rnorm(5, 0,1),2))
df2 <- data.frame(a = c('a','b','c','d','e'), 
                  b = round(rnorm(5, 1,1.5),2))

ui <- fluidPage(
  titlePanel("example"),
  sidebarLayout(
    sidebarPanel(
      selectInput(inputId = "df",
                  label = "Choose a table:",
                  choices = c("df1", 
                              "df2")),
    ),
    mainPanel(
      actionButton("reset", "Reset"),
      actionButton("save", "Save Changes"),
      DTOutput("df")

      )
    )
  )
server <- function(input, output) {
  dfInput <- reactive({
    switch(input$df,
           "df1" = df1,
           "df2" = df2)
  })

  observeEvent(input$reset, {
    output$df <- renderDT(dfInput(), editable = TRUE,
                          options = list(lengthChange = FALSE))
  })

  output$df <- renderDT(dfInput(), editable = TRUE,
                        options = list(lengthChange = FALSE))
}
shinyApp(ui = ui, server = server)

谢谢!

【问题讨论】:

    标签: r shiny dt


    【解决方案1】:

    一种可能的解决方案是使用observeEvent 并实时记录所做的任何编辑,而不是等待用户点击保存按钮。如果该方法适合您,那么这可能会有所帮助。

    请注意,您只需要一个output 而不是两个,reset 将自动恢复为原始数据。为此,您可以使用reactiveValues 来存储您的数据。在这种情况下,我为df1df2 制作了两个数据框的list

    此外,为了在此示例中进行编辑测试,我在创建时将stringsAsFactors = FALSE 添加到您的两个 data.frames(因此编辑不限于因子级别)。

    library(shiny)
    library(DT)
    
    df1 <- data.frame(a = c('a','b','c','d','e'), 
                      b = round(rnorm(5, 0,1),2),
                      stringsAsFactors = F)
    df2 <- data.frame(a = c('a','b','c','d','e'), 
                      b = round(rnorm(5, 1,1.5),2),
                      stringsAsFactors = F)
    
    ui <- fluidPage(
      titlePanel("example"),
      sidebarLayout(
        sidebarPanel(
          selectInput(inputId = "df",
                      label = "Choose a table:",
                      choices = c("df1", 
                                  "df2")),
        ),
        mainPanel(
          actionButton("reset", "Reset"),
          #actionButton("save", "Save Changes"),
          DTOutput("df")          
        )
      )
    )
    
    server <- function(input, output) {
      rv <- reactiveValues(tables = list("df1" = df1, "df2" = df2))
    
      dfInput <- reactive({
        rv$tables[[input$df]]
      })
    
      observeEvent(input[["df_cell_edit"]], {
        cell <- input[["df_cell_edit"]]
        rv$tables[[input$df]][cell$row, cell$col] <- cell$value
      })
    
      observeEvent(input$reset, {
        rv$tables <- list("df1" = df1, "df2" = df2)
      })
    
      output$df <- renderDT(dfInput(), editable = TRUE,
                            options = list(lengthChange = FALSE))
    }
    
    shinyApp(ui = ui, server = server)
    

    【讨论】:

    • 这让我非常接近!您如何参考编辑后的 ​​dfs 以供将来使用?例如,假设用户更改了 df1 和 df2 中的单元格,我使用这些更改进行计算。有没有办法引用修改后的 dfs(而不是原始的)?
    • 是的 - 您可以参考 reactiveValues。例如: rv$tables[[“df1”]] 获取已编辑的 df1 表
    猜你喜欢
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 2016-07-13
    • 1970-01-01
    • 2022-06-11
    相关资源
    最近更新 更多