2017-01-19 12 views
1

Ich möchte ein bedingtes Feld in meiner Karte anzeigen, wenn ich auf einen Kreis klicke, und dieses bedingte Feld muss verschwinden, wenn ich außerhalb eines Kreises klicke, aber nicht erscheint und Ich weiß nicht warum.R Flugblatt: Bedingtes Feld erscheint nicht in Karte

Ich denke, es geht um reaktive Werte (noch einmal).

Wenn eine Idee, bitte sagen Sie mir.

Vielen Dank, das ist ein reproduzierbares Beispiel (dank SymbolixAU):

ui:

library(shiny) 
library(leaflet) 

ui <- fluidPage(
    leafletOutput("mymap",width="100%",height="750px"), 

    conditionalPanel(

    condition = "output.COND == '2'", 

    fluidRow(

     absolutePanel(id = "cond_panel", 
        class = "panel panel-default", 
        fixed = TRUE, 
        draggable = TRUE, 
        top = "auto", 
        left = 200, 
        right = "auto", 
        bottom = 0, 
        width = 400, 
        height = 400, 
        fluidRow(

        ) # e. of fluidRow(

     ) # # e. of absolutePanel 

    ) # e. of fluidRow 

) # e. of conditionalPanel 

) # e. of fluidPage 

und der Server:

server <- function(input, output){ 

    rv <- reactiveValues() 
    rv$myDf <- NULL 
    rv$cond <- NULL 

    cities <- read.csv(textConnection(" 
           City,Lat,Long,Pop 
           Boston,42.3601,-71.0589,645966 
           Hartford,41.7627,-72.6743,125017 
           New York City,40.7127,-74.0059,8406000 
           Philadelphia,39.9500,-75.1667,1553000 
           Pittsburgh,40.4397,-79.9764,305841 
           Providence,41.8236,-71.4222,177994 
           ")) 
    cities$id <- 1:nrow(cities) 

    output$mymap <- renderLeaflet({ 
    leaflet(cities) %>% addTiles() %>% 
     addCircles(lng = ~Long, lat = ~Lat, weight = 1, 
      radius = ~sqrt(Pop) * 30, popup = ~City, layerId = ~id) 
    }) 

    observeEvent(input$mymap_click, { 

    print("map clicked") 
    rv$cond <- "1" 
    print(paste("Value rv$cond = ", rv$cond)) 
    output$COND <- reactive({rv$cond}) 
    leafletProxy("mymap") 

    }) # e. of observeEvent 

    observeEvent(input$mymap_shape_click, { 

    print("shape clicked") 
    rv$cond <- "2" 
    print(paste("Value rv$cond = ", rv$cond)) 
    output$COND <- reactive({rv$cond}) 
    leafletProxy("mymap") 

    }) # e. of observeEvent 

} # e. of server 

Antwort

2

Ich schlage vor, werde ein etwas anderer Ansatz, der library(shinyjs) verwendet, um Javascript zu verwenden, um zu steuern, ob das Panel ausgeblendet ist oder nicht.

In diesem Beispiel habe ich erstellt ein verstecktdiv Element (das heißt, wird das Panel versteckt starten, wenn die App öffnet). Dann wird das "div" angezeigt, wenn auf den Kreis geklickt wird, und beim Klicken auf die Karte wieder ausgeblendet.

Diese Antwort ist inspiriert von @Daattali's answer here (er ist der Autor von library(shinyjs).

library(shiny) 
library(leaflet) 
library(shinyjs) 

ui <- fluidPage(
    useShinyjs(),  ## Call to use shinyJS 
    leafletOutput("mymap",width="100%",height="750px"), 

    #conditionalPanel(

     #condition = "output.COND === '2'", 
    hidden( 
     div(id = "conditionalPanel", 
      fluidRow(

       absolutePanel(id = "cond_panel", 
          class = "panel panel-default", 
          fixed = TRUE, 
          draggable = TRUE, 
          top = "auto", 
          left = 200, 
          right = "auto", 
          bottom = 0, 
          width = 400, 
          height = 400, 
          fluidRow(

        ) # e. of fluidRow(

       ) # # e. of absolutePanel 

      ) # e. of fluidRow 
     ) 
    ) 

# ) # e. of conditionalPanel 

) # e. of fluidPage 


server <- function(input, output){ 

    rv <- reactiveValues() 
    rv$myDf <- NULL 
    rv$cond <- NULL 

    cities <- read.csv(textConnection(" 
         City,Lat,Long,Pop 
         Boston,42.3601,-71.0589,645966 
         Hartford,41.7627,-72.6743,125017 
         New York City,40.7127,-74.0059,8406000 
         Philadelphia,39.9500,-75.1667,1553000 
         Pittsburgh,40.4397,-79.9764,305841 
         Providence,41.8236,-71.4222,177994 
         ")) 
    cities$id <- 1:nrow(cities) 

    output$mymap <- renderLeaflet({ 
     leaflet(cities) %>% addTiles() %>% 
      addCircles(lng = ~Long, lat = ~Lat, weight = 1, 
           radius = ~sqrt(Pop) * 30, popup = ~City, layerId = ~id) 
    }) 

    observeEvent(input$mymap_click, { 

     shinyjs::hide(id = "conditionalPanel") 
     print("map clicked") 
     rv$cond <- "1" 
     print(paste("Value rv$cond = ", rv$cond)) 
     output$COND <- reactive({rv$cond}) 
     leafletProxy("mymap") 

    }) # e. of observeEvent 

    observeEvent(input$mymap_shape_click, { 

     shinyjs::show(id = "conditionalPanel") 
     print("shape clicked") 
     rv$cond <- "2" 
     print(paste("Value rv$cond = ", rv$cond)) 
     output$COND <- reactive({rv$cond}) 
     leafletProxy("mymap") 

    }) # e. of observeEvent 

} # e. of server 

shinyApp(ui, server) 
+0

Du bist die beste SymbolixAU, es funktioniert prima! Ich hätte es nie geschafft, ohne deine Hilfe zu arbeiten, es ist das dritte Mal, dass du mir seit gestern hilfst. Vielen Dank, einen schönen Tag. –

+0

@Mickey_NC - kein Problem, fühl dich frei zu akzeptieren/'tick "Die Antwort, wenn es dein Problem löst! – SymbolixAU

0

einfach die absolutePanel in einem conditionalPanel Zustand, das verwenden Sie basierend auf Benutzereingaben zurückgesetzt.