Я хотел бы использовать пакет перекрестных помех, чтобы связать строки редактируемого DT DataTable с точками Leaflet Map в блестящем приложении с использованием общего набора данных. Идея этой части приложения заключается в том, что пользователь загружает файл с уличными адресами, которые геокодируются API, а затем выходные данные обновляются для отображения точек. Пользователь должен иметь возможность изменять координаты (если они неверны или неточны), что должно автоматически обновлять карту.
Чтобы использовать перекрестные помехи в таблице DT, я установил Server=FALSE
в renderDT()
. Однако, чтобы изменения в таблице DT автоматически обновлялись на карте, я использовал функцию replaceData()
с proxyDataTable()
, которая, как я понимаю, работает только на стороне сервера, что противоречит настройке server=FALSE
перекрестных помех. Это приводит к следующей ошибке, когда я редактирую таблицу:
Предупреждение DataTables: table id = DataTables_Table_1 - Неверный ответ JSON. Для получения дополнительной информации об этой ошибке см. http://datatables.net/tn/1
Ниже приведен упрощенный пример.
library(shiny)
library(DT)
library(leaflet)
library(crosstalk)
ui <- fluidPage(
fluidRow(column(6,DT::dataTableOutput("Table")),
column(6,leafletOutput("Map")))
)
server <- function(input, output, session) {
#This would usually be an fileinput
x <- data.frame(id = c(1,2,3,4),
lat = c(60,65,70,75),
lon = c(60,55,40,45))
y <- reactiveValues()
y$data <- x
observe({
SharedTable <- SharedData$new(y$data)
output$Table <- DT::renderDT({
datatable(SharedTable,
filter = "top",
editable = TRUE,
rownames = FALSE,
class = "compact",
selection = "single",
options = list(
columnDefs = list(list(className = "dt-center", targets = "_all"))
)) %>%
formatRound(c("lat", "lon"), digits = 6)
}, server = FALSE)
output$Map <- renderLeaflet({
leaflet() %>%
flyToBounds(min(y$data$lon), min(y$data$lat), max(y$data$lon), max(y$data$lat)) %>%
addProviderTiles(providers$OpenStreetMap) %>%
addAwesomeMarkers(data = SharedTable,
lng = ~as.numeric(lon),
lat = ~as.numeric(lat))
})
})
proxy = dataTableProxy('Table')
observeEvent(input$Table_cell_edit, {
info = input$Table_cell_edit
i = info$row
j = info$col + 1
v = info$value
y$data[i, j] = DT::coerceValue(v, y$data[i, j])
replaceData(proxy, y$data, resetPaging = FALSE, rownames = FALSE)
})
}
shinyApp(ui = ui, server = server)
Изменение координат действительно работают в приложении так, как задумано, можно ли подавить это сообщение об ошибке или это может вызвать проблемы в будущем? Или есть другой способ связать эти два выхода? Извините, если я неправильно понимаю, как работают эти пакеты, я новичок в R Shiny.
Спасибо!