当我尝试加载多个表并使用闪亮的DT进行渲染时,我在 R 中面临内存不足的问题。
我想知道是否可以只向 DT 提供表结构(例如,行和列名的数量),并预加载前 N 行数据以显示在应用程序中,然后在用户单击另一个页面时加载另外 N 行(启用分页)。我发现 DT 有一个dataTableAjax
返回 Ajax URL 的函数,可以被 DT 查询(不知道它是怎么做的)
原始数据表 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都不熟悉,请耐心等待并提供尽可能多的细节,在此先感谢!