2017-04-23 63 views
0

我正在一個閃亮的應用程序,它顯示傳單地圖上的一些標記。當點擊其中一個標記時,data.frame的相應行應顯示在地圖右側的rhandsontable中。詳細地說,地圖寬度應該減小(例如從100%減少到50%),並且在可用空間中應該插入角標。閃亮的單張地圖,在標記點擊減少地圖的寬度和插入表輸出

有沒有一些問題,我的代碼,我沒能解決到目前爲止:

  1. 標記並不是繪製地圖時,他們是leafletProxy(這是必要的,更復雜的應用程序)內。

  2. 只有第一個標記點​​擊觀察,那麼該表就不再變化(可能出錯observeEvent)

  3. 的rhandsontable添加地圖下方,而不是在空間的權利,得到免費,當地圖寬度減少時。

數據應存儲在反應值中(以便進行更改)。

這裏是一個最小的可重複的例子:

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) 
+0

關於3)應該使用STHG像:'fluidRow( 柱(寬度= 10,偏移= 0,式= '填充:0像素;', leafletOutput(「map」,width =「100%」,height =「500px」)), column(width = 2,offset = 0,style ='padding:0px;', rHandsontableOutput(「table」) ) )'並根據您的需要設置列的寬度。 – BigDataScientist

+0

列的問題是,它預先分配空間。所以如果我使用你建議的代碼,最初會在地圖右側(總寬度的2/12)有空白區域。但是我想要最初使用全寬的地圖,並且只有當點擊標記時,地圖的某些寬度才能用於rhandsontable。希望,這表明清楚。 – needRhelp

回答

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) 
+0

啊,對不起,我誤解了你,沒有想過在renderUI中使用column。優秀作品! – needRhelp

+0

nono,我的壞。評論中難以總結。我只是不想寫作答案,因爲其他人傾向於認爲這些問題現在已經得到充分回答;) – BigDataScientist