Search code examples
rshinyr-leaflet

Replace plotoutput by leafletoutput on double click


I have an output from plotOutput and when there is a double click on the map, I want to see an output from leafletoutput. In the code below, when there is a double click on the map, the leaflet map shows below the google map. Before double click the the first image shows but after double clicking, I want to see the leaflet map only. Do you have any suggestions on how to do this?

   library(shiny)
   library(shinydashboard)
   library(leaflet)
   library(dismo)
   library(ggmap)
   library(dplyr)

 shinyApp(
 ui = dashboardPage(
 dashboardHeader(title=""),

 dashboardSidebar(width = 200 ),


dashboardBody(   
  
  fluidRow(
    
    plotOutput("USA_GoogleMap",dblclick='plot_dblclick'),
    leafletOutput("leaflet_map")
    
    
  )
)),

 server=function(input, output, session) {

double_clicked <- reactiveValues(

center = NULL 
)

  # Handle double clicks on the plot

observeEvent(input$plot_dblclick, {

double_clicked$center <- c(input$plot_dblclick$x,input$plot_dblclick$y)

 })



output$USA_GoogleMap<-renderPlot({

statesMap = map_data("state")

xy=cbind(statesMap$long,statesMap$lat)
y=c(36.4,41.5,42.25,27.7,32.77)
x=c(-115.5,-100,-75,-81.5,-97.45)
state=c("Nevada","Nebraska","New York","Florida","Texas")
bases=cbind(x,y)
bases_mercator=data_frame(Mercator_X=Mercator(bases)[,1],Mercator_Y=Mercator(bases)[,2],State=state)


g = gmap(xy, type='satellite',zoom=4)   
plot(g, inter=TRUE)
points(Mercator(bases) , pch=20,cex=16, col=adjustcolor("white", alpha=0.2))
points(Mercator(bases) , pch=20,cex=16, col=adjustcolor("yellow", alpha=0.4))
text(bases_mercator$Mercator_X,bases_mercator$Mercator_Y,state)

})


 output$leaflet_map <- renderLeaflet({
if(!is.null(double_clicked$center)){
  
  leaflet()%>%setView(lng = -71.0589, lat = 42.3601, zoom = 12)%>%addTiles()
 }
})
}
   )
 shinyApp(ui = ui, server = server)

First Image

enter image description here

Second image

enter image description here


Solution

  • Let me first preface this by saying - there's a better way to do this than I'm showing. I just haven't found one yet. I'm sure a much better programmer than I would know of it, but at least I can say this works. Even though it's hideous. The key to hiding the plot was using conditionalPanel (which I was previously unfamiliar with).

    I have a text trigger for identifying whether or not the plot was double-clicked, and use that to trigger whether or not to show the panel. However, I couldn't get the text to initialize without calling it with textOutput... so I have a textOutput call with a font size of zero. Again, there must be a much better way of triggering that than I'm doing it... but again, at least it works. Hopefully it will help.

    library('shiny')
    library('shinydashboard')
    library('leaflet')
    library('dismo')
    library('ggmap')
    library('dplyr')
    
    shinyApp(
      ui = dashboardPage(
        dashboardHeader(title=""),
    
        dashboardSidebar(width = 200 ),
    
        dashboardBody(   
    
          fluidRow(
            conditionalPanel(
              condition = 'output.condition == 0',
              plotOutput("USA_GoogleMap",dblclick='plot_dblclick')
            ),
            leafletOutput("leaflet_map"),
            textOutput('condition'),
            tags$head(tags$style("#condition{font-size: 0px}"))
    
          )
        )),
    
      server=function(input, output, session) {
    
        double_clicked <- reactiveValues(
    
          center = NULL 
        )
    
        # Handle double clicks on the plot
    
        observeEvent(input$plot_dblclick, {
    
          double_clicked$center <- c(input$plot_dblclick$x,input$plot_dblclick$y)
    
        })
    
        output$USA_GoogleMap<-renderPlot({
          if(is.null(double_clicked$center)){
            statesMap = map_data("state")
    
            xy=cbind(statesMap$long,statesMap$lat)
            y=c(36.4,41.5,42.25,27.7,32.77)
            x=c(-115.5,-100,-75,-81.5,-97.45)
            state=c("Nevada","Nebraska","New York","Florida","Texas")
            bases=cbind(x,y)
            bases_mercator=data_frame(Mercator_X=Mercator(bases)[,1],Mercator_Y=Mercator(bases)[,2],State=state)
    
            g = gmap(xy, type='satellite',zoom=4)   
            plot(g, inter=TRUE)
            points(Mercator(bases) , pch=20,cex=16, col=adjustcolor("white", alpha=0.2))
            points(Mercator(bases) , pch=20,cex=16, col=adjustcolor("yellow", alpha=0.4))
            text(bases_mercator$Mercator_X,bases_mercator$Mercator_Y,state)
    
          }
    
        })
    
    
        output$leaflet_map <- renderLeaflet({
          if(!is.null(double_clicked$center)){
    
            leaflet()%>%setView(lng = -71.0589, lat = 42.3601, zoom = 12)%>%addTiles()
          }
        })
    
        output$condition <- renderText({
          ifelse(!is.null(double_clicked$center), 1, 0)
        })
    
      }
    
    )