在 R shiny 应用程序中捕获 editable datatable 的输出以用于另一个 table

capture output of editable datatable in R shiny app to be used in another table

我正在尝试捕获对数据表 (mytable) 的编辑,然后创建反映编辑的第二个数据表 (new_table)。有一个单独的 input$rows 和 input$columns 决定了原始 mytable 中有多少 rows/columns.

我似乎无法捕获原始 mytable 的输出。 非常感谢任何帮助

library(DT)
shinyApp(
          ui = fluidPage(
                         
                         textInput("rows", 
                                   "enter rows", 
                                   value = "2"), 
                         
                         textInput("columns", 
                                   "enter columns", 
                                   value = "3"), 
                         DTOutput('mytable'), 
                         DTOutput("new_table")
          ),
          
          
          
          server = function(input, output) {
                    
                    
                    data <- reactive({
                              as.data.frame(matrix(" ", 
                                                   as.numeric(input$rows), 
                                                   as.numeric(input$columns)))
                    })
                    
                    
                    
                    dfon <- reactiveValues(data = NULL)
                    
                 
                 
                     output$mytable <- renderDataTable({
                            
                            datatable(
                                      data(), 
                                      editable = 'cell'
                            )
                  })
                    
                  
                  
                  
                  observeEvent(input$mytable_cell_edit, {
                            info = input$mytable_cell_edit
                            str(info)
                            #i = info$row
                            #j = info$col + 1  # offset by 1
                            #v = info$value
                            
                            #dfon$top[i, j] <<- DT::coerceValue(v, dfon$top[i, j])
                            dfon$data <<- editData(dfon$data, info)
                  })
                    
                    output$new_table <- renderDataTable({
                              datatable(dfon$data)
                    })
          
          }
          
)

最简单的解决方案是:

library(shiny)
library(DT)
library(tidyverse)

shinyApp(
  ui = fluidPage(
    textInput("rows",
      "enter rows",
      value = "2"
    ),
    textInput("columns",
      "enter columns",
      value = "3"
    ),
    DTOutput("mytable"),
    DTOutput("new_table")
  ),
  server = function(input, output) {
    data <- reactive({
      req(input$rows, input$columns)
      as.data.frame(matrix(
        " ",
        as.numeric(input$rows),
        as.numeric(input$columns)
      ))
    })

    dfon <- reactiveValues(data = NULL)

    observe({
      dfon$data <- data()
    })

    output$mytable <- renderDataTable({
      datatable(
        data(),
        editable = "cell"
      )
    })

    observeEvent(input$mytable_cell_edit, {
      info <- input$mytable_cell_edit

      i <- info$row
      j <- info$col
      v <- info$value

      dfon$data[i, j] <- v
    })

    output$new_table <- renderDataTable({
      datatable(dfon$data)
    })
  }
)

我们可以使用 dataTableProxy,但它适用于新行,新列比较棘手。