Исходя из вашего кода, проблема в том, что прокси-серверу нужен глобальный сеанс (а не сеанс модуля). Смотрите мой другой ответ для альтернативного подхода.
Вы можете просто передать глобальный session
в модуль через аргумент.
Это работает:
library(shiny)
library(DT)
modDtUi <- function(id){ # UI module
ns = NS(id)
DT::dataTableOutput(ns('x1'))
}
modDt <- function(input, output, session, data, globalSession){ # Server module
x <- data
output$x1 <- DT::renderDataTable(x, selection = 'none', editable = TRUE)
proxy <- dataTableProxy('x1', session = globalSession)
observeEvent(input$x1_cell_edit, {
info = input$x1_cell_edit
str(info)
print(info)
i = info$row
j = info$col
v = info$value
x[i, j] <<- DT::coerceValue(v, x[i, j])
replaceData(proxy, x, resetPaging = FALSE)
})
}
Теперь вам нужно добавить глобальный сеанс в вызов модуля.
С блестящим приложением:
ui <- fluidPage(
modDtUi("editable")
)
server <- function(input, output, session) {
callModule(modDt,"editable", data = iris, globalSession = session)
}
shinyApp(ui = ui, server = server)
С гибкой приборной панелью:
```{r}
modDtUi("editable")
```
```{r}
callModule(modDt, "editable", data = iris, globalSession = session)
```
Если вы хотите использовать обновленную таблицу в остальной части вашего приложения, просто верните reactive(x)
из вашего модуля и перехватите его при вызове модуля.
editable_iris <- callModule(modDt,"editable", data = iris, globalSession = session)