我在页面上有表,可以在列中排序,在我用反应表重新加载数据后不再排序,这里是服务器。R 代码:
library(shiny)
shinyServer(function(input, output) {
# Return the requested dataset
datasetInput <- reactive({
switch(input$dataset2,
"[,...]" = diamonds,
"[10:30,...]" = diamonds,
"[31:50,...]" = diamonds)
})
#"[,...]" = diamonds[,],
#"[10:30,...]" = diamonds[10:30,],
#"[31:50,...]" = diamonds[31:50,])
# Show the first "n" observations
output$view <- renderTable({
head(datasetInput())
})
# a large table, reative to input$show_vars
output$mytable1 <- renderDataTable({
library(ggplot2)
datasetInput()[, input$show_vars, drop = FALSE]
})
})
保留排序顺序(和选择)的最佳方法是使用代理数据表和替换数据来更新数据,而不是在每次更新数据时都创建一个新表:
mydata = reactive({
df$ID <<- c(df$ID[n], df$ID[-n])
df
})
output$foo = DT::renderDataTable(isolate(mydata()))
proxy = dataTableProxy('foo')
observe({
replaceData(proxy, mydata(), resetPaging = FALSE)
})
不过,有几件事需要注意。如果您使用的是模块,请检查此线程以确保将正确的会话变量传递给代理:https://github.com/rstudio/DT/issues/359
此外,如果对数据表使用 rownames=false,则还必须传递参数以替换数据。
如果 proxyDataTable 不是一个选项,您还可以在 DT::renderDataTable 中使用回调:
#include some javascript
tags$head(tags$script(src="my.js"))
#options to renderDataTable
preDrawCallback = JS("initTableOrder"),
drawCallback = JS("saveTableOrder")
javascript 函数在 my.js 中(存储在您的 www 目录中):
var tableSortOrderSave;
function initTableOrder(settings, json) {
if(tableSortOrderSave === undefined){
$(this.api().table().order());
}else{
$(this.api().table().order(tableSortOrderSave));
}
}
function saveTableOrder(settings, json) {
order = $(this.api().table().order());
if(order.length > 0){
tableSortOrderSave = order;
}
}