闪亮的传单地图,在标记点击减少地图宽度和插入tableoutput

时间:2017-04-23 08:29:05

标签: r shiny leaflet

我正在制作一个闪亮的应用程序,它在传单地图上显示了一些标记。单击其中一个标记时,data.frame的相应行应显示在地图右侧的rhandsontable中。详细地说,地图宽度应该减少(例如从100%到50%),并且在自由空间中应该插入rhandsontable。

我的代码存在一些问题,到目前为止我无法解决这个问题:

  1. 当标记位于leafletProxy内时(在更复杂的应用程序中是必需的),标记不会在地图上绘制。

  2. 只观察到第一个标记点​​击,然后表格不再变化(可能是observeEvent错误)

  3. rhandsontable被添加到地图下方,而不是在右边的空格中,当地图宽度减小时,它会自由。

  4. 数据应存储在无效值中(以便进行更改)。

    这是一个可重复性最小的例子:

    library(shiny)
    library(leaflet)
    library(rhandsontable)
    
    ui <- fluidPage(
      fluidRow(
        uiOutput("map2"), 
        uiOutput("table2")
      )
    )
    
    
    server <- function(input, output, session){
      values <- reactiveValues(
        data = data.frame(X = c(1, 2), lat = c(48, 49), lng = c(11, 11.5)),
        which_marker = NULL,
        leaflet_map_width = "100%"
      )
    
      output$map2 <- renderUI({
        leafletOutput("map", width = values$leaflet_map_width, height = "500px")
      })
    
      output$map <- renderLeaflet({
        leaflet() %>% addTiles() %>% setView(11, 48.5, 8) # %>% addMarkers(data = values$data, layerId = values$data$X)
      })
    
      observe({
        leafletProxy("map") %>% addMarkers(data = values$data, layerId = values$data$X)
      })
    
      observeEvent(input$map_marker_click, {
        print("observed map_marker_click")
        values$which_marker <- input$map_marker_click$id
        values$leaflet_map_width = "50%"
        output$table2 <- renderUI({
          rHandsontableOutput("table")
        })
      })
    
      output$table <- renderRHandsontable({
        data <- values$data[values$which_marker, ]
        rhandsontable(t(data), rowHeaderWidth = 120)
      })
    }
    
    shinyApp(ui, server)
    

1 个答案:

答案 0 :(得分:1)

注意:这只回答了1/3的问题。 但正如人们在评论中看到的那样,在那里给出提示是没有意义的: 要回答第三个问题,请参阅下面的解决方案。 (根据需要设置列的宽度)

library(shiny)
library(leaflet)
library(rhandsontable)

ui <- fluidPage(
  uiOutput("map2")
)


server <- function(input, output, session){
  values <- reactiveValues(
    data = data.frame(X = c(1, 2), lat = c(48, 49), lng = c(11, 11.5)),
    which_marker = NULL,
    leaflet_map_width = "100%"
  )

  observe({
    values$which_marker <- input$map_marker_click$id
  })

  output$map2 <- renderUI({
    if(!is.null(input$map_marker_click)){
      fluidRow(
        column(width = 10, offset = 0, style='padding:0px;',
          leafletOutput("map", width = "100%", height = "500px")),
        column(width = 2, offset = 0, style='padding:0px;',
          rHandsontableOutput("table")
        )
      )
    }else{
      leafletOutput("map", width = values$leaflet_map_width, height = "500px")
    }

  })

  output$map <- renderLeaflet({
    leaflet() %>% addTiles() %>% addMarkers(data = values$data, layerId = values$data$X)
  })

  output$table <- renderRHandsontable({
    data <- values$data[values$which_marker, ]
    rhandsontable(t(data), rowHeaderWidth = 120)
  })
}

shinyApp(ui, server)