具有闪亮功能的DT:可编辑的多页可编辑数据表在编辑后跳至第一页

时间:2019-08-04 23:32:57

标签: r shiny dt

我有以下程序。就像标题所示,每次我在第一页之后的页面上编辑项目时,表格都会回到第一页。我希望表格保留在我正在编辑的页面上,而不会跳回到第一页。

我在这里的其他线程上看到了这个问题,但是它们的解决方案似乎不适用于当前版本的DTshiny软件包。

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


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

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

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:1)

请参阅DT-edit。我复制了以下两个相关示例:

library(shiny)
library(DT)

dt_output = function(title, id) {
    fluidRow(column(
        12, h1(paste0('Table ', sub('.*?([0-9]+)$', '\\1', id), ': ', title)),
        hr(), DTOutput(id)
    ))
}
render_dt = function(data, editable = 'cell', server = TRUE, ...) {
    renderDT(data, selection = 'none', server = server, editable = editable, ...)
}

shinyApp(
    ui = fluidPage(
        title = 'Double-click to edit table cells',

        dt_output('client-side processing (editable = "cell")', 'x1'),
        dt_output('server-side processing (editable = "cell")', 'x5')
    ),

    server = function(input, output, session) {
        d1 = iris
        d1$Date = Sys.time() + seq_len(nrow(d1))
        d5 = d1

        options(DT.options = list(pageLength = 5))

        # client-side processing
        output$x1 = render_dt(d1, 'cell', FALSE)

        observe(str(input$x1_cell_edit))

        # server-side processing
        output$x5 = render_dt(d5, 'cell')

        # edit a single cell
        proxy5 = dataTableProxy('x5')
        observeEvent(input$x5_cell_edit, {
            info = input$x5_cell_edit
            str(info)  # check what info looks like (a data frame of 3 columns)
            d5 <<- editData(d5, info)
            replaceData(proxy5, d5, resetPaging = FALSE)  # important
            # the above steps can be merged into a single editData() call; see examples below
        })

    }
)

我不确定为什么您似乎不必要地使reactiveValues的过程复杂化,但这可能是您的表需要刷新回到第一页的原因。

答案 1 :(得分:1)

您可以这样做:

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

    dat <- reactiveVal(cbind(iris, Date = Sys.time() + seq_len(nrow(iris))))

    output$x1 = renderDT(isolate(dat()), selection = 'none', editable = TRUE)

    proxy = dataTableProxy('x1')

    observeEvent(input$x1_cell_edit, {
      info = input$x1_cell_edit
      dat(editData(dat(), info, proxy, resetPaging = FALSE))
    })

    output$print <- renderPrint({
      dat()
    })
  }
)