2017-01-19 4 views
1

Я хочу отобразить условную панель на моей карте, когда я нажимаю на круг, и эта условная панель должна исчезнуть, если я нахожусь за пределами круга, но она не отображается и Я не знаю почему.R Лист: условная панель не отображается на карте

Я думаю, что речь идет о реактивных значениях (еще один раз).

Если какая-либо идея, сообщите мне.

Большое спасибо, это воспроизводимый пример (благодаря SymbolixAU):

УИ:

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 

и сервер:

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 

ответ

2

Я собираюсь предложить несколько иной подход, который использует library(shinyjs) для использования javascript для контроля того, скрыта ли панель или нет.

В этом примере я создал скрытыйДИВ элемент (то есть, панель начнет скрыта, когда откроется приложение). Затем «div» отображается при щелчке по кругу и снова скрывается при щелчке по карте.

Этот ответ вдохновлен @Daattali's answer here (он автор 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

Ты лучший SymbolixAU, он отлично работает! Я бы никогда не нашел, как обойтись без вашей помощи, это третий раз, когда вы помогаете мне со вчерашнего дня. Большое вам спасибо, отлично провели день. –

+0

@Mickey_NC - не проблема! не стесняйтесь принимать/'тикать 'ответ, если он решает вашу проблему! – SymbolixAU

0

Просто используйте absolutePanel внутри conditionalPanel, состояние которого вы сбрасываете на основании пользовательского ввода.