Search code examples
rshinyr-leaflet

How can I save previous reactive values?


How can I save previous reactive values in R shiny? I want to extract the coordiantes of the last two marker locations (leaflet). I tried it with the isolate function (without success). In it's current form my code can store the currend reactive variable but it can't store the last one.

Here is my code:

# Define UI 
ui <- fluidPage(
  leafletOutput("mymap",height=800)
)

# Define server logic 
server <- function(input, output) {
  
  # Leaflet
  output$mymap <- renderLeaflet(
    leaflet() %>%
      addTiles() %>%
      setView(lng = 8.53918, lat = 47.36864, zoom = 11) %>%
      addDrawToolbar(
        targetGroup='draw',
        polylineOptions = F,
        polygonOptions = F,
        rectangleOptions = F,
        circleOptions = F,
        circleMarkerOptions = F,
        editOptions = editToolbarOptions(selectedPathOptions = selectedPathOptions()))  %>%
      addLayersControl(overlayGroups = c('draw'), options =
                         layersControlOptions(collapsed=FALSE))
  )
  
  reactive({
    
    PosData <- data.frame(PosX = c(NA,NA),
                          PosY = c(NA,NA),
                          PosDegree = c(NA,NA))
    
  })
 
  
  # Extract coordinates
  observeEvent(input$mymap_draw_new_feature,{
    if(input$mymap_draw_new_feature$geometry$type == "Point"){

      PosData$PosX[1] <- input$mymap_draw_new_feature$geometry$coordinates[[1]]
      PosData$PosY[1] <- input$mymap_draw_new_feature$geometry$coordinates[[2]]
      
      PosData$PosX[2] <- PosData$PosX[1]
      PosData$PosY[2] <- PosData$PosY[1]
      
      print(PosData)

    }else{f <- 2}

  })
}

# Run the application
shinyApp(ui = ui, server = server)```


Solution

  • In this app, the reactive table PosData will contain the positions of the last 2 markers:

    library(shiny)
    library(leaflet)
    library(leaflet.extras)
    library(tidyverse)
    
    ui <- fluidPage(
      leafletOutput("mymap", height = 800),
      tableOutput("PosData")
    )
    
    # Define server logic
    server <- function(input, output) {
    
      # Leaflet
      output$mymap <- renderLeaflet(
        leaflet() %>%
          addTiles() %>%
          setView(lng = 8.53918, lat = 47.36864, zoom = 11) %>%
          addDrawToolbar(
            targetGroup = "draw",
            polylineOptions = F,
            polygonOptions = F,
            rectangleOptions = F,
            circleOptions = F,
            circleMarkerOptions = F,
            editOptions = editToolbarOptions(selectedPathOptions = selectedPathOptions())
          ) %>%
          addLayersControl(
            overlayGroups = c("draw"), options =
              layersControlOptions(collapsed = FALSE)
          )
      )
    
      PosData <- reactiveVal(value = tibble(PosX = numeric(), PosY = numeric()))
    
      output$PosData <- renderTable(PosData())
    
      # Extract coordinates
      observeEvent(input$mymap_draw_new_feature, {
        req(input$mymap_draw_new_feature$geometry$type == "Point")
    
        PosData() %>%
          add_row(
            PosX = input$mymap_draw_new_feature$geometry$coordinates[[1]],
            PosY = input$mymap_draw_new_feature$geometry$coordinates[[2]]
          ) %>%
          # keep last 2 points
          tail(2) %>%
          PosData()
      })
    }
    
    # Run the application
    shinyApp(ui = ui, server = server)
    

    enter image description here