在保持位置的同时更新Shiny DataTable的行

我正在创建一个Shiny应用程序,该应用程序在屏幕顶部显示data.frame信息,并在底部显示特定的变量统计信息。 用户可以通过与DT::datatable对象交互来导航data.frame列。

当用户点击一个变量时,会显示可编辑的详细信息。 我希望这些信息能够更新并反映在数据表中。 我的问题是,当我更新表格时,它从一开始就被渲染和显示。 如何在编辑后保留数据表的页面和行选择?

这是一个最小的工作示例,它显示DT::datatable中的mtcars数据集。 我有一些更新字段的控件。 请注意,datatable被重新渲染回第一页。

library(shiny)

runApp(shinyApp(

  ui = fluidPage(
    title = "minimal-working-example",
    fluidRow(
      column(3, inputPanel(
        selectInput("field", "Field", choices = names(mtcars)),
        numericInput("value", "Value", 0),
        actionButton("submit", "Submit")
      )),

      column(9,
        DT::dataTableOutput("table")
      )
    )
  ),

  server = function(input, output) {

    v <- reactiveValues(mtcars=mtcars)

    observeEvent(input$submit, {
      v$mtcars[input$field] <- input$value
    })

    output$table <- DT::renderDataTable({
      DT::datatable(
        v$mtcars,
        selection = "single",
        options = list(pageLength = 5))
    })
  }
))

会议信息:

Session info --------------------------
 setting  value                       
 version  R version 3.3.0 (2016-05-03)
 system   x86_64, mingw32             
 ui       RStudio (0.99.902)          
 language (EN)                        
 collate  English_United States.1252  
 tz       America/Chicago             
 date     2016-07-11                  

Packages -------------------------------
 package     * version     date       source                        
 DT            0.1.45      2016-02-09 Github (rstudio/DT@a63e9ac)   
 shiny       * 0.13.0.9000 2016-02-08 Github (rstudio/shiny@e871934)

这可以从内部R上做并不进入的结构datatable通过JS或类似的东西。

我们利用我们从一开始的各种表状态信息DT包来呈现新的更新datatable像以前一样的人。 我们使用的所有内容均在此DT文档中描述。

第一项:选择。 您可以通过在datatable的selection参数内添加selected = ...来预先选择行。 这可以与变量input$table_rows_selected以保存先前选择的行并在重新呈现时预先选择该确切的行。

第二项:第页。 该datatable包有一个选项displayStart指定渲染表时哪一行应该被首先显示。 文档在这里。 因此,如果每页有5行, displayStart = 9将启动第3页的显示。(JavaScript数组从0开始,所以总是减1)。这可以与input$table_rows_current结合使用,它是当前可见行的向量数字。 如果我们存储第一个条目(减1),我们知道从哪里开始显示。

下面的完整代码示例:

library(shiny)

runApp(shinyApp(

  ui = fluidPage(
    title = "minimal-working-example",
    fluidRow(
      column(3, inputPanel(
        selectInput("field", "Field", choices = names(mtcars)),
        numericInput("value", "Value", 0),
        actionButton("submit", "Submit")
      )),

      column(9,
        DT::dataTableOutput("table")
      )
    )
  ),

  server = function(input, output) {

    v <- reactiveValues(mtcars=mtcars)
    previousSelection <- NULL
    previousPage <- NULL

    observeEvent(input$submit, {
      previousSelection <<- input$table_rows_selected
      previousPage <<- input$table_rows_current[1] - 1

      v$mtcars[input$field] <- input$value
    })

    output$table <- DT::renderDataTable({
      DT::datatable(
        v$mtcars,
        selection = list(mode = "single", target = "row", selected = previousSelection),
        options = list(pageLength = 5, displayStart = previousPage))
    })
  }
))
链接地址: http://www.djcxy.com/p/92455.html

上一篇: Update row(s) of a Shiny DataTable while maintaining position

下一篇: Vagrant Windows