invalidateLater 用于增加值
invalidateLater for incrementing values
我有一个闪亮的应用程序,除其他功能外,它还允许用户单击传单地图,捕获经纬度作为船只的坐标,输入航向和速度并将此信息传递给雷达一个套接字上的模拟器。鉴于船的航向和速度,我需要每秒将更新的坐标传递给雷达模拟器。想必,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
值。
稍微修改一下,以便您可以使用最小表示:
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
语句打印正确计算的值,但不是以一秒为间隔。就像我在问题中提到的那样,我需要将这些值传递给模拟器,但间隔为一秒。我怎样才能做到这一点?
我仍然不完全确定如何,但最终通过从 observe
中删除 req()
使其工作:
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
不可用时应用程序不会停止。
我有一个闪亮的应用程序,除其他功能外,它还允许用户单击传单地图,捕获经纬度作为船只的坐标,输入航向和速度并将此信息传递给雷达一个套接字上的模拟器。鉴于船的航向和速度,我需要每秒将更新的坐标传递给雷达模拟器。想必,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
值。
稍微修改一下,以便您可以使用最小表示:
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
语句打印正确计算的值,但不是以一秒为间隔。就像我在问题中提到的那样,我需要将这些值传递给模拟器,但间隔为一秒。我怎样才能做到这一点?
我仍然不完全确定如何,但最终通过从 observe
中删除 req()
使其工作:
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
不可用时应用程序不会停止。