Mikado8787
Mikado8787

Reputation: 55

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)```

Upvotes: 1

Views: 553

Answers (1)

danlooo
danlooo

Reputation: 10637

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

Upvotes: 2

Related Questions