есть досадная проблема, которую я не могу исправить в глянцевом / DT, и поэтому я решил поднять этот вопрос, может быть, кто-то смог найти работоспособное решение.Я прочитал много форумов, и некоторые (stackoverflow fe) предлагают некоторые идеи, так как другие пользователи также сталкивались с этой проблемой.Во всяком случае, я не смог реализовать надежное решение.
Я строю блестящее решение, которое использует много разных экземпляров данных для отображения различных данных.Пользователь может взаимодействовать со всеми данными, а также изменять, удалять и добавлять новые записи в таблицы.Содержимое таблиц сохраняется в реактивных значениях.
Если я использую настройку параметров в соответствии с пунктом Nr.2 по этой ссылке: https://rstudio.github.io/DT/options.html все работает нормально, если вы используете фиксированные целые числа.Я могу установить желаемую длину страницы, и таблица всегда отображается так, как должна.Я хотел бы добиться того, чтобы пользователь мог выбирать любые параметры длины страницы, которые он пожелает, и сохранять эти параметры длины страницы и номера страницы после перерисовки таблицы из-за обновления набора реактивных значений за таблицей.Есть несколько аналогичных вопросов по stackoverflow, и я перепробовал все рекомендуемые решения, но, похоже, у меня ничего не работает.
Мой подход был (я представляю только серверную часть, очевидно, у меня есть объект DT напользовательская сторона, называемая «workForcePoolOutput» и необходимые кнопки и т. д.): • создание переменной для хранения предварительно заданных пользовательских настроек.
---------- Shiny App Server Side Code ----------
server <- shinyServer(function(input, output,session) {
#Workforce Table constants
workForcePoolOutput_previousPageLength <- NULL
workForcePoolOutput_previousPage <- NULL
• настройка таблицы
output$workforcePoolOutput <- DT::renderDataTable(DT::datatable(values$workForceData[,1:15], rownames = FALSE, filter = list(position = "top",clear = TRUE),
options = list(pageLength = if(is.null(workForcePoolOutput_previousPageLength)){10} else{workForcePoolOutput_previousPageLength},
displayStart = if(is.null(workForcePoolOutput_previousPage)){0} else {workForcePoolOutput_previousPage},
stateSave = TRUE)))
• IТеперь представьте код, который я использовал для добавления нового значения в базу данных Workforce
#Observing the action button for new work force
observeEvent(input$newWorkForceButton, {
# Updating the holding variables of the previous table settings
workForcePoolOutput_previousPageLength <<- input$workforcePoolOutput_state$length
workForcePoolOutput_previousPage <<- input$workforcePoolOutput_rows_current[1] - 1
#......... some function logic, works fine not related to the problem
#updating the reactive value
temp <- rbind(values$workForceData,new_fella)
values$workForceData <- temp
#Print the previous user setting for checking
print(workForcePoolOutput_previousPage)
print(workForcePoolOutput_previousPageLength)
#Rerender the table, this part may not be necessary as I have the same outside of the
#"observeButton" function. I tried to include or exclude this part here, no real change in behaviour
output$workforcePoolOutput <- DT::renderDataTable(DT::datatable(values$workForceData[,1:15], rownames = FALSE, filter = list(position = "top",clear = TRUE),
options = list(pageLength = if(is.null(workForcePoolOutput_previousPageLength)){10} else {workForcePoolOutput_previousPageLength}, displayStart = if(is.null(workForcePoolOutput_previousPage)){0} else {workForcePoolOutput_previousPage}, stateSave = TRUE)))
Теперь эта динамическая настройка пагинации кажется действительно сложной.Странно то, что если я запускаю свой компьютер утром и запускаю приложение, кажется, что все работает более-менее нормально, но относительно стабильно.Я могу играть за столом, добавлять новых сотрудников, и данные нумерации страниц отображаются правильно.После этого я закрываю приложение и перезапускаю его, и все начинает вести себя очень странно.
Я прилагаю несколько скриншотов, чтобы описать поведение.Например, я вижу таблицу, которая показывает 10 записей на странице, и я смотрю на вторую страницу.Я добавляю новую запись в таблицу, и таблица перерисовывается.Перед повторным рендерингом R записывает в консоль ранее сохраненные настройки и в соответствии с этим все было сохранено правильно.10 записей на страницу и отображение начинается на 10-й записи, или 2-й странице.Однако таблица перерисовывается с 25 записями на странице.
Это всего лишь пример, приложение, которое я разрабатываю, содержит много похожих таблиц, и моим пользователям не нравится тот факт, что они не могут изменять содержимое таблицы без потеринастройки нумерации страниц.
Если бы вы могли иметь некоторые идеи, я был бы более чем благодарен!Спасибо!