R Shiny DT - 使用响应式表格编辑值

16
可以通过编辑DT::DataTable来更新响应式数据源吗?以下代码基于this code,不同之处在于x是响应式的。当尝试在observeEvent中更改x时,问题就开始了。
将x设置为响应式的目的是我打算从外部数据库获取它,然后对DT::DataTable进行编辑,以便将其写回到数据库中,以使其与用户所见保持同步(我可以做到这一点 - 它不是问题的一部分)。
library(shiny)
library(DT)
shinyApp(
  ui = fluidPage(
    DTOutput('x1')
  ),
  server = function(input, output, session) {
    x = reactive({
      df <- iris
      df$Date = Sys.time() + seq_len(nrow(df))
      df
    })
    output$x1 = renderDT(x(), selection = 'none', editable = TRUE)

    proxy = dataTableProxy('x1')

    observeEvent(input$x1_cell_edit, {
      info = input$x1_cell_edit
      str(info)
      i = info$row
      j = info$col
      v = info$value

      # problem starts here
      x()[i, j] <<- isolate(DT::coerceValue(v, x()[i, j])) 
      replaceData(proxy, x(), resetPaging = FALSE)  # important
    })
  }
)

4
我想你想要看一下handsontable的软件包。 - Bertil Baron
2个回答

22

我不确定我是否正确理解您的意思,但也许这个解决方案可以帮助您解决一些问题。我将您的响应式变量改为了一个reactiveValues对象,并删除了replaceData行。

library(shiny)
library(DT)
shinyApp(
  ui = fluidPage(
    DTOutput('x1'),
    verbatimTextOutput("print")
  ),
  server = function(input, output, session) {
    x = reactiveValues(df = NULL)

    observe({
      df <- iris
      df$Date = Sys.time() + seq_len(nrow(df))
      x$df <- df
    })

    output$x1 = renderDT(x$df, selection = 'none', editable = TRUE)

    proxy = dataTableProxy('x1')

    observeEvent(input$x1_cell_edit, {
      info = input$x1_cell_edit
      str(info)
      i = info$row
      j = info$col
      v = info$value

      # problem starts here
      x$df[i, j] <- isolate(DT::coerceValue(v, x$df[i, j]))
    })

    output$print <- renderPrint({
      x$df
    })
  }
)

1
我遇到了一个问题,如果更改列1,则info$col实际上显示为0。不确定为什么我的应用程序中会得到n-1的列号。还有其他人见过这种情况吗?我明天会使用虚拟应用程序代码进行测试。 - Mark
我有同样的问题,但仅仅将1添加到col中也不起作用。 - Simon Woodward
实际上,当rownamesNULL时似乎会发生这种情况,这会在编辑第一列时导致错误,并且否则会编辑错误的列。但是对j加1似乎对我有用。 - SeGa

5

如果您在DT中未显示行名称,则应将1添加到info $ col 以获取正确的列,即j = info $ col + 1


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接