Ändern der Leaflet-Karte nach Eingabe ohne Neuzeichnen

Frage ich mich, wie ich das ändern kann Glänzend und Faltblatt-Plots, nach dem Wechsel in der Eingabe ohne Neuzeichnen der gesamten Karte.

Den code, den ich verwende, ist:

library(leaflet)
library(shiny)
library(dplyr)
library(readr)

ui <- fluidPage(
  titlePanel("Melbourne Urban Tree Visualisation"),
  leafletOutput("treedat"),
  uiOutput("precinct")
   #Giving an input name and listing out types to choose in the Shiny app
  )

server <- function(input, output){

  #td <- read.csv("treedata.csv", header = TRUE)

  #pal <- colorNumeric(
  #palette = "RdYlGn",
  #domain = td$LifeExpectencyValue
  #)

  output$precinct <- renderUI({

    choices <- as.character(unique(td$Precinct))  
    choices <- c('All', choices)
    selectInput(inputId = "precinct", label = "Precinct", choices = choices, selected = "CBD")

  })


  output$treedat <- renderLeaflet({
    #if(is.null(td)) return()
    ## get the choice from teh drop-down box
    PRECINCT = input$precinct

    ## supbset the data based on the choice
    if(PRECINCT != 'All'){
      td2 <- td[td$Precinct == PRECINCT, ]
    }else{
      td2 <- td
    }
    ## plot the subsetted ata
    td2 <- leafletProxy(td2) %>% addTiles(
      urlTemplate = 'http://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png',
      attribution='Map tiles by <a href="http://stamen.com">Stamen Design</a>, <a href="http://creativecommons.org/licenses/by/3.0">CC BY 3.0</a> &mdash; Map data &copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>') %>% 
      addCircleMarkers(radius= 5,
                       fillOpacity = 0.5, 
                       stroke = FALSE,
                       color=~pal(LifeExpectencyValue),
                       popup=paste("<b>", td$CommonName,"</b>", "<br>", 
                                   "<b>","Years Left:", "</b>", td$LifeExpectency, "<br>", 
                                   "<b>","Genus:","</b>", td$Genus)) %>% addLegend(pal = pal, 
                                                                      values = ~LifeExpectencyValue, 
                                                                      opacity = 1, 
                                                                      title = "Life Expectency")
    return(td2)
  })
}

shinyApp(ui = ui, server = server)

Den Datensatz verwendet, der code ist unter diesem link verfügbar – Melbourne Stadtwald Daten

Gibt es viele Punkte, so dass ich würde nicht wollen, um neu zu zeichnen jedes mal, wenn der Eingang gewechselt wird. Der Eingang ist auf der Grundlage der „Fußgängerzone“ – Spalte in das dataset. Jede Hilfe hier ist tief geschätzt.

  • Verwenden leafletProxy. Es ist eine Dokumentation, die unter dieser link.
  • Hallo, ich habe versucht leafletProxy aber konnte es nicht funktionieren. Die app würde nicht laufen? Bin ich etwas fehlt?
  • Tut mir Leid, ich sollte haben schaute sich diesen genauer an. Ja, du verwendest es falsch. Ich brauche einige Zeit, um sich mit einem code-Beispiel (leider hast du kein lauffähiges Beispiel) um zu zeigen, wie der Befehl zu benutzen ist.
  • Sorry! Nehmen Sie sich Zeit. Keine Eile. Danke für das Angebot, um zu helfen.



One Reply
  1. 11

    Okay, dort gehen Sie: leafletProxy wird verwendet, um Ebenen hinzufügen, um eine vorhandene Broschüre Karte. Die Nutzung ist genauso wie die normalen Broschüre Ergänzungen, aber Sie brauchen nicht die rendering-Teil, da die Karte bereits erbrachten in Ihrem Dokument.

    Die erste und einfachste Teil ist render der leaflet-Karte auf einer grundlegenden Ebene, das ist Fliesen, Legende, statische Zeichnungen, alles, was Sie tun möchten, nur einmal. Dies ist Ihr Ausgangspunkt. Von da an, verändern der map ist nur durch direkte Befehle, anstelle von re-renderings.

    Diese Karte kann nun zugegriffen werden, die über seine glänzende Ausgabe, id. In sich Fall, wir hatten leafletOutput("treedat"), so dass, wenn wir wollen, um diese Karte, verwenden wir leafletProxy("treedat"). Wir verwenden die gleiche syntax wie bei normalen Merkblatt-änderungen. E. g. leafletProxy("treedat") %>% addMarkers(lat = 1, lng = 1) fügt eine Markierung auf der bestehenden map ohne neu zu Rendern.

    Somit wird jede änderung an der map kann /hat zu geschehen, von innen etwas observe – Anweisung und nicht aus dem inneren der renderLeaflet. Beachten Sie, dass jeder Befehl ist eine Ergänzung zu der original-Karte, die ist, warum musste ich clearMarkers im Beispiel unten.

    Code:

    library(leaflet)
    library(shiny)
    library(dplyr)
    library(readr)
    
    ui <- fluidPage(
      titlePanel("Melbourne Urban Tree Visualisation"),
      leafletOutput("treedat"),
      uiOutput("precinct")
       #Giving an input name and listing out types to choose in the Shiny app
      )
    
    server <- function(input, output){
    
      td <- data.frame(
        LifeExpectencyValue = sample(20:100, 10), 
        Precinct = c(rep("CBD", 3), rep("ABC", 4), rep("XYZ", 3)),
        CommonName = sapply(1:10, function(x){paste(sample(LETTERS, 10, replace = TRUE), collapse = "")}),
        Genus = rep(c("m","f"), each = 5),
        lat = seq(5, 50, 5),
        lng = seq(2, 65, 7)
      )
    
      pal <- colorNumeric(palette = "RdYlGn", domain = td$LifeExpectencyValue)
    
      output$precinct <- renderUI({
    
        choices <- as.character(unique(td$Precinct))  
        choices <- c('All', choices)
        selectInput(inputId = "precinct", label = "Precinct", choices = choices, selected = "CBD")
    
      })
    
    
      output$treedat <- renderLeaflet({
    
        leaflet() %>% 
          addTiles(
            urlTemplate = 'http://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png',
            attribution='Map tiles by <a href="http://stamen.com">Stamen Design</a>, <a href="http://creativecommons.org/licenses/by/3.0">CC BY 3.0</a> &mdash; Map data &copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'
          ) %>%
          addLegend(pal = pal, values = td$LifeExpectencyValue, opacity = 1, title = "Life Expectency")
    
      })
    
      observeEvent(input$precinct, {
    
        #if(is.null(td)) return()
        ## get the choice from teh drop-down box
        PRECINCT = input$precinct
    
        ## supbset the data based on the choice
        if(PRECINCT != 'All'){
          td2 <- td[td$Precinct == PRECINCT, ]
        }else{
          td2 <- td
        }
        ## plot the subsetted ata
        leafletProxy("treedat") %>%
          clearMarkers() %>%
          addCircleMarkers(lat = td2$lat, lng = td2$lng,
            radius= 5, fillOpacity = 0.5, stroke = FALSE, color=pal(td2$LifeExpectencyValue),
            popup = paste("<b>", td2$CommonName,"</b>", "<br>", 
              "<b>","Years Left:", "</b>", td2$LifeExpectency, "<br>", 
              "<b>","Genus:","</b>", td2$Genus))
      })
    }
    
    shinyApp(ui = ui, server = server)
    • Hervorragende Erklärung! Vielen Dank für diese. Ich ersetzte Ihr Beispieldatensatz mit dem original aber immer eine Fehlermeldung „FEHLER: [on_request_read] connection reset by peer“, wenn Sie versuchen, um die app auszuführen.
    • Update: Behoben! Parameter für mein dataset falsch war. Jedoch, jetzt, wenn es ausgeführt wird, bekomme ich die Weltkarte anzeigen und Heranzoomen, ganz ein bisschen, um zu Australien. Irgendeine Idee, wie kann ich dieses Problem beheben?
    • Verwenden setView innerhalb der ersten Einweihung.
    • Ich habe versucht, diese leaflet() %>% addTiles( urlTemplate = 'http://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png', attribution='Map tiles by <a href="http://stamen.com">Stamen Design</a>, <a href="http://creativecommons.org/licenses/by/3.0">CC BY 3.0</a> &mdash; Map data &copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>' ) %>% setView(lng = td$Longitude, lat = td$Latitude, zoom = 4) %>% addLegend(pal = pal, values = td$LifeExpectencyValue, opacity = 1, title = "Life Expectency") }). Aber es hat nicht funktioniert.
    • Update: es Behoben. Aber die map ändert sich nicht nach dem Eingang. Es noch Grundstücke alle. Irgendwelche Ideen?
    • Update: es wurden die oben genannten problem. Wie mache ich Glänzend auf die Stelle, die geändert wird mit der Eingabe-widget?
    • setView wieder auf den proxy. Sieht aus wie Sie werden es herausfinden.
    • Ich habe versucht, mit setView innen observeEvent aber kein Glück. Hoffe, Sie können helfen.
    • Ich habe gerade %>% setView(lat = mean(td2$lat), lng = mean(td2$lng), zoom = 3) zu den leafletProxy und es funktioniert.
    • Schön! Es ist alles jetzt getan! Noch einmal vielen Dank!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.