Home > OS >  How can I save previous reactive values in R shiny?
How can I save previous reactive values in R shiny?

Time:02-19

Hi and thank you for your answer,

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

CodePudding user response:

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

  • Related