Я столкнулся с проблемой нехватки памяти в R, когда пытался загрузить несколько таблиц и отобразить их с помощью DT а> в блестящем.
Мне интересно, можно ли предоставить только структуру таблицы (например, без имен строк и столбцов) для DT и предварительно загрузить данные первых N строк для отображения в приложении, а затем загрузить еще N строк, когда пользователь щелкает другую страницу ( разбиение на страницы включено). Я обнаружил, что в DT есть функция dataTableAjax
, которая возвращает URL-адрес Ajax и может быть запрошена DT (не знаю, как это делается)
Оригинальная JS-библиотека datatables имеет аналогичную функцию (если я не ошибаюсь), как в 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, пожалуйста, наберитесь терпения и предоставьте как можно больше подробностей, заранее спасибо!