我正在制作一个闪亮的应用程序,它在传单地图上显示了一些标记。单击其中一个标记时,data.frame的相应行应显示在地图右侧的rhandsontable中。详细地说,地图宽度应该减少(例如从100%到50%),并且在自由空间中应该插入rhandsontable。
我的代码存在一些问题,到目前为止我无法解决这个问题:
当标记位于leafletProxy内时(在更复杂的应用程序中是必需的),标记不会在地图上绘制。
只观察到第一个标记点击,然后表格不再变化(可能是observeEvent错误)
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 :(得分: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)