如何使用datatable函数替换R呈现的DT中的数据

时间:2019-07-04 01:41:30

标签: r shiny dt

我有一个R shiny应用程序,它带有一个DT datatable,该应用程序通过datatable函数呈现,以便设置各种选项。我想使用dataTableProxyreplaceData更新表中的数据,但是我能找到的所有示例都假设DT是直接从数据对象呈现的,而不是使用{ {1}}功能。下面的reprex显示了我想做的事情,但是datatable在这种模式下不起作用。我该怎么做呢?谢谢。

replaceData

1 个答案:

答案 0 :(得分:2)

更新:很奇怪,删除rownames = FALSE使其成为可能。我不确定为什么,但是行名对于替换数据可能是必不可少的。

# based on 
# https://community.rstudio.com/t/reorder-data-table-with-seleceted-rows-first/4254

library(shiny)
library(DT)

ui = fluidPage(
  actionButton("button1", "Randomize"),
  fluidRow(
    column(6,
           h4("Works"),
           DT::dataTableOutput('table1', width="90%")),
    column(6,
           h4("Doesn't Work"),
           DT::dataTableOutput('table2', width="90%"))
  )
)

server = function(input, output, session) {

  my <- reactiveValues(data = iris)

  output$table1 <- DT::renderDataTable(isolate(my$data))

  output$table2 <- DT::renderDataTable({
    DT::datatable(isolate(my$data),
                  options = list(lengthChange=FALSE, ordering=FALSE, searching=FALSE,
                                 columnDefs=list(list(className='dt-center', targets="_all")),
                                 stateSave=TRUE, info=FALSE),
                  class = "nowrap cell-border hover stripe",
                 # rownames = FALSE,
                  editable = FALSE
    ) %>%
      DT::formatStyle('Sepal.Width', `text-align`="center")
  })

  observeEvent(input$button1, {

    # calculate new row order
    row_order <- sample(1:nrow(my$data))
    my$data <- my$data[row_order, ]

    proxy1 <- DT::dataTableProxy('table1')
    DT::replaceData(proxy1, my$data)
    proxy2 <- DT::dataTableProxy('table2')
    DT::replaceData(proxy2, my$data)

  })

}

shinyApp(ui, server)