【发布时间】:2021-04-07 18:51:58
【问题描述】:
当我尝试加载多个表并在 Shiny 中使用 DT 进行渲染时,我遇到了 R 中的内存不足问题。
我想知道是否可以只向 DT 提供表结构(例如,没有行和列名),并预加载前 N 行数据以显示在应用程序中,然后在用户单击时加载另外 N 行另一个页面(启用分页)。我发现DT有一个dataTableAjax函数,它返回一个Ajax URL并且可以被DT查询(不知道它是怎么做的)
原来的datatables JS库有一个类似的特性(如果我没记错的话),如https://datatables.net/examples/server_side/defer_loading.html
例如,
sample_table <- data.frame(a = rnorm(1e7), b = rnorm(1e7), c = rnorm(1e7))
library(fst)
# write large data on disk
write_fst(sample_table, "sample_table.fst")
# how to load data on disk on-demand using Ajax?
shinyApp(
ui = fluidPage(
title = 'Server-side processing of DataTables',
fluidRow(
DT::dataTableOutput('tbl')
)
),
server = function(input, output, session) {
# create a widget using an Ajax URL created above
tbl_ajax_url <- reactiveVal({
dataTableAjax(
session,
read_fst("sample_table.fst", from = 1, to = 100, as.data.table = TRUE),
outputId = 'tbl')
})
observeEvent(input$tbl_rows_current, {
rows <- input$tbl_rows_current
tbl_ajax_url(dataTableAjax(
session,
# random access like fst, only load required data when user click the page
read_fst("sample_table.fst", from = min(rows), to = max(rows),
as.data.table = TRUE),
outputId = 'tbl'))
})
output$tbl = DT::renderDataTable({
datatable(data.table(
a = numeric(), b = numeric(), c = numeric(),
check.names = FALSE), rownames = FALSE, options = list(
ajax = list(
serverSide = TRUE, processing = TRUE,
# not sure how to do this part, where url only return part of data
url = tbl_ajax_url()
)
))
})
}
)
如果您有任何其他建议,也请告诉我。我的主要目标是防止一次在 R 中加载所有表,而是仅按需加载部分。
PS:我对任何HTML、CSS和JS都不熟悉,请耐心提供尽可能多的细节,在此先感谢!
【问题讨论】:
标签: r shiny datatables dt fst