R Shiny DT - 使用反应式编辑表中的值

Posted

技术标签:

【中文标题】R Shiny DT - 使用反应式编辑表中的值【英文标题】:R Shiny DT - edit values in table with reactive 【发布时间】:2018-11-01 08:45:03 【问题描述】:

是否可以通过编辑 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
    )
  
)

【问题讨论】:

我想你想看看包handsontable 【参考方案1】:

我不确定我是否理解正确,但也许这个解决方案可能会对你有所帮助。我将您的响应式更改为 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 列,info$col 实际上会显示 0。不知道为什么我的应用程序中的列号为 n -1。还有人看到这个吗?我明天会用这个虚拟应用代码进行测试 我也有同样的问题,但是简单地在 col 中加 1 也不起作用。 确实,当rownamesNULL 时似乎会发生这种情况,这会在编辑第一列时导致错误,否则会编辑错误的列。但是将 1 添加到 j 似乎可以解决我的问题。【参考方案2】:

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

【讨论】:

以上是关于R Shiny DT - 使用反应式编辑表中的值的主要内容,如果未能解决你的问题,请参考以下文章

渲染 JavaScript 会破坏 R Shiny DT (DataTable) 中的页面导航和反应功能

R Shiny:修改选择后保留/保留反应输入的值

Shiny 和 R 中的 DT:自定义数字格式

在R Shiny中过滤rhandsontable中的行

r 在Shiny中使用DT数据表中的图标

使用客户端处理(服务器 = F)在 Shiny 应用程序中进行 DT 编辑会引发 JSON 错误