首页 > 解决方案 > R Shiny - 多页可编辑数据表在编辑后跳转到第 1 行

问题描述

我正在使用 R 3.3.1、Shiny v. 1.2.0 和 v. DT 0.5 开发一个 Shiny 应用程序。其中一个元素是跨多个页面的可编辑数据表。在我进行编辑后,焦点所在的行会跳转到第 1 行,这会破坏用户体验。

以下是使用以下代码段重现此问题的具体步骤:

  1. 加载应用程序
  2. 切换到数据表的第 2 页
  3. 编辑第 3 行第 2 列:将 Duh 更改为 Blue 并按 Tab
  4. 观看当前行跳转到第 1 页第 1 行。这将更容易查看每页是否有更多行。

我在第 4 步得到的并不是理想的行为。我希望数据表将焦点保持在我刚刚编辑的同一行上。

我愿意使用自定义 JS 逻辑来完成这项工作。

看似相关的问题 - DataTable 不记得编辑后的分页页面,但我不知道如何在这个特定示例中从 R 桥接到 JS。

 R.version.string
# "R version 3.3.1 (2016-06-21)"

library(shiny)  # v. 1.2.0
library(DT)  # v. 0.5

page_length <- 2 # 5 elements should span 3 pages

hardcoded_df <- read.table(text = "Fruit Color
                                   Apple Red
                                   Plum Purple
                                   Blueberry Duh
                                   Orange Carrot
                                   Crocodile Green",
                           header = TRUE,
                           stringsAsFactors = FALSE)

ui <- fluidPage(
   DT::dataTableOutput('x1')
)

server <- function(input, output) {
  x = reactiveValues(df = hardcoded_df)

   output$x1 = renderDT(DT::datatable(x$df, options = list(pageLength = page_length), selection = 'none', editable = TRUE))

   proxy = dataTableProxy('x1')

   observeEvent(input$x1_cell_edit, {
     info = input$x1_cell_edit
     str(info)

     # str(input$x1_state)
     i = info$row
     j = info$col
     v = info$value

     # Without this line the table does not change but with it it jumps to row 1 after an edit.
     x$df[i, j] <- isolate(DT::coerceValue(v, x$df[i, j]))

     # Now we need to scroll to row i somehow ... clearly this does not work. Help!
     selectPage(proxy, ceiling(i / page_length))
     # selectRow(proxy, i)
   })
}

# Run the application 
shinyApp(ui = ui, server = server)

标签: rshinydt

解决方案


在这种情况下DT::replaceData,应该可以正常工作,如此resetPaging = FALSE所示 。但是,将我解决的一些问题定义为原因xreactiveValues()isolate

 server <- function(input, output, session) {
    x = reactiveValues(df = hardcoded_df)
    output$x1 = renderDT(DT::datatable(isolate(x$df), 
                options = list(pageLength = page_length), selection = 'none', editable = TRUE))

    proxy = dataTableProxy('x1')

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

      # Without this line the table does not change but with it it jumps to row 1 after an edit.
      x$df[i, j] <- isolate(DT::coerceValue(v, x$df[i, j]))
      DT::replaceData(proxy, x$df, resetPaging = FALSE)  # important
      # Now we need to scroll to row i somehow ... clearly this does not work. Help!
      #selectPage(proxy, ceiling(i / page_length))
      # selectRow(proxy, i)
    })
  }

推荐阅读