Редактирование DT в приложении Shiny с обработкой на стороне клиента (server = F) вызывает ошибку JSON - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть приложение Shiny Server, в котором пользователь может редактировать таблицу данных, после чего обновляется некоторая зависимая сводная статистика таблицы.Я размещаю это приложение на довольно медленной основе, поэтому я хочу использовать обработку на стороне клиента для рендеринга DT (server = F передается в DT :: renderDataTable).Позвольте мне разбить основные моменты моей проблемы:

  • Код полностью работает, когда Сервер = T передается как аргумент.

  • При передаче Сервер = F браузер выдает следующее сообщение об ошибке, когда пользователь редактирует ячейку в DT:

Error Message

Написано:

Предупреждение DataTables: идентификатор таблицы = DataTables_Table_5 - Неверный ответ JSON.Для получения дополнительной информации об этой ошибке см. http://datatables.net/tn/1

Интересно то, что при закрытии этого окна ошибки зависимая сводная статистика корректно обновляется в соответствии с редактированием, и приложение Shiny продолжает работу..Следовательно, все работает, кроме ошибки.Я должен отметить, что я посетил сайт, упомянутый в ошибке, не становясь мудрее.

Следующая тема SO затрагивает эту проблему (неразрешенная).Я решил, что перед отправкой этой (возможной ошибки?) На страницу Git я бы отправил подробный SO-поток.

Полагаю, это не сильно поможет, учитывая, что приложение работает, однако мой код приведен ниже;

server.R:

output$alloc_table = DT::renderDataTable({

    DT::datatable(dt,
                  options=list(pageLength=10, autowidth = TRUE), 
                  editable = T,
                  selection = list(mode = 'none')) %>%

 }, server = FALSE)

alloc_table_proxy = DT::dataTableProxy('alloc_table')

observeEvent(input$alloc_table_cell_edit, {

info = input$alloc_table_cell_edit
str(info)
i = info$row
j = info$col
v = info$value

if (j == 7){

  container$rendered$Allocation[i] = DT::coerceValue(v, container$rendered$Allocation[i])
  replaceData(alloc_table_proxy, container$rendered, rownames = FALSE)

}

})

Спасибо!

РЕДАКТИРОВАТЬ: Воспроизводимый код в моей теме выпуска Github: https://github.com/rstudio/DT/issues/598

1 Ответ

0 голосов
/ 02 октября 2018

Ответы были получены на ветке Github , и я делюсь своим ответом здесь.

Возможно, он не задокументирован четко.Это не имеет ничего общего с редактированием.Это потому, что replaceData() вызывает reloadData(), что требует режима обработки на стороне сервера.См. ?reloadData().

reloadData () работает только для таблиц в режиме обработки на стороне сервера, например, таблиц, отображаемых с помощью renderDataTable (server = TRUE).Загружаемые данные (т. Е. Те, которые вы передаете dataTableAjax ()), должны иметь ровно столько же столбцов, что и предыдущий объект данных в таблице.

...