invalidateLater для увеличения значений - PullRequest
1 голос
/ 05 июня 2019

У меня есть приложение Shiny, которое, помимо других функций, позволяет пользователю нажимать на карту листовки, фиксировать широту в качестве координат корабля, передавать курс и скорость и передавать эту информацию на радиолокационный симулятор черезрозетка.Учитывая курс и скорость корабля, мне нужно каждую секунду передавать обновленные координаты на радиолокационный симулятор.Предположительно, invalidateLater() - это то, что мне нужно после прочтения этого .Но почему-то я просто не могу сосредоточиться на функционировании invalidateLater().Это то, что я до сих пор безуспешно пробовал:

#Reactive values to hold the lat lon of the map_click event
rvs <- reactiveValues()
observe({
  req(rvs$own_ship_lat)
  invalidateLater(1000) 

  #Data to be passed to the simulator
  df <- data.frame(Type='Platform',ID='Own_Ship',Lat = rvs$own_ship_lat,
                   Lon = rvs$own_ship_lon,
                   Alt=10.5, LandReflect = 10,
                   Course=input$own_course,
                   Speed=input$own_speed)

  #Convert the data to json format
  jdata <- jsonlite::toJSON(df)

  #Function to make a socket connection and pass on the json data to the simulator
  sendDRS(jdata)

  #Calculate next point to be passed on to the simulator
  next_pt <- geosphere::destPoint(c(rvs$own_ship_lon, rvs$own_ship_lat), 
                       input$own_course, input$own_speed)


    isolate(rvs$own_ship_lat <- next_pt[2])
    isolate(rvs$own_ship_lon <- next_pt[1])
    # print(next_pt)

})

rvs$own_ship_lat и rvs$own_ship_lon удерживают латинские значения щелчка мышью на листовой карте.Если я раскомментирую print(next_pt), он бесконечно печатает первые правильно вычисленные значения next_pt.

Ответы [ 2 ]

0 голосов
/ 11 июня 2019

Я до сих пор не совсем уверен, как, но, наконец, он заработал, удалив req() из observe:

observe({
    invalidateLater(1000)
    tryCatch({
    isolate(next_pt <- geosphere::destPoint(c(rvs$own_ship_lon, rvs$own_ship_lat),
                                    input$own_course, input$own_speed))
    print(next_pt)
    isolate(rvs$own_ship_lat <- next_pt[2])
    isolate(rvs$own_ship_lon <- next_pt[1])
    },error = function(e){cat("ERROR :",conditionMessage(e), "\n")})

  })

Добавил tryCatch(), чтобы приложение не останавливалось приrvs$own_ship_lat или rvs$own_ship_lon недоступны.

0 голосов
/ 09 июня 2019

Немного изменив это, чтобы у вас было минимальное значение для воспроизведения:

ui <- fluidPage(
  sliderInput('own_course', 'Set Course', min = 0, max = 359, value = 60),
  sliderInput('own_speed', 'Set Speed', min = 0, max = 40, value = 12),
  leafletOutput('own_ship', height = 600, width = '100%')
)

server <- function(input, output, session) {

  #Own ship map
  output$own_ship <- renderLeaflet({
    leaflet() %>% addTiles() %>% 
      setView(72.8777,19.076,12) %>%
      addProviderTiles(providers$OpenSeaMap) %>%
      leafem::addMouseCoordinates()
  })

  rvs <- reactiveValues()
  observeEvent(input$own_ship_click, {
    rvs$own_ship_lat <- input$own_ship_click$lat
    rvs$own_ship_lon <- input$own_ship_click$lng
  })

  observe({
    req(rvs$own_ship_lat)
    invalidateLater(1000) 

    #Calculate next point to be passed on to the simulator
    next_pt <- geosphere::destPoint(c(rvs$own_ship_lon, rvs$own_ship_lat), 
                                    input$own_course, input$own_speed)

    print(next_pt)
    isolate(rvs$own_ship_lat <- next_pt[2])
    isolate(rvs$own_ship_lon <- next_pt[1])


  })
}

shinyApp(ui, server)

Если вы запустите это, вы заметите, что оператор print печатает правильно рассчитанные значения, но не приинтервал в одну секунду.Как я уже упоминал в своем вопросе, мне нужно передать эти значения в симулятор, но с интервалом в одну секунду.Как мне этого добиться?

...