Ошибка при использовании редактируемой таблицы ОУ с пакетом перекрестных помех в R Shiny - PullRequest
1 голос
/ 26 мая 2020

Я хотел бы использовать пакет перекрестных помех, чтобы связать строки редактируемого 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.

Спасибо!

...