我刚接触光泽,遇到了困难。我想要一张带有互动圈子的地图。单击时,这些圆圈将允许我查询SQL数据库以获取相应的数据并进行绘制。
尽管我能够将圈子信息打印到闪亮的ui,但我并没有设法将圈子信息变成变量。
这是示例代码:
library(shiny)
library(leaflet)
ui <- fluidPage(
leafletOutput("mymap"),
verbatimTextOutput("marker")
)
server <- function(input, output, session) {
output$mymap <- renderLeaflet({
leaflet(data = mapStates, options = leafletOptions(minZoom = 3, maxZoom = 18)) %>%
addTiles() %>%
addProviderTiles(providers$Stamen.TonerLite,
options = providerTileOptions(noWrap = TRUE))%>%
addCircleMarkers(data = data.frame(lat = 51, lng = 13,STANAME = "somewhere",STAID = "1" ), lng = ~lng, lat = ~lat,radius = 1, color = "red", fill = "red", popup = ~STANAME,layerId = ~STAID)
})
# here the circle info
output$marker <- renderPrint(input$mymap_marker_click)
}
shinyApp(ui, server)
但是我无法在服务器函数中将标记的ID放入变量中。我尝试过:
input$mymap_marker_click$id
但是它告诉我,我需要一个被动的环境。如果我这样做:
renderPrint(input$mymap_marker_click)$id
错误:“关闭”类型的对象不可子集化
我不能在服务器端使用输出,但是我需要在服务器端使用此变量来进行查询和绘图。
我应该继续吗? 谢谢您的帮助。
答案 0 :(得分:1)
在Shiny中,您需要创建一个观察者以“监听”点击事件(或输入的任何事件/更改)并执行特定的响应。
不知道mapStates
来自哪里,但删除地图图块,但是想法是相同的。
library(shiny)
library(leaflet)
ui <- fluidPage(
leafletOutput("mymap"),
verbatimTextOutput("marker")
)
server <- function(input, output, session) {
output$mymap <- renderLeaflet({
leaflet(options = leafletOptions(minZoom = 3, maxZoom = 18)) %>%
addCircleMarkers(data = data.frame(lat = 51, lng = 13,STANAME = "somewhere",STAID = "1" ), lng = ~lng, lat = ~lat,radius = 1, color = "red", fill = "red", popup = ~STANAME,layerId = ~STAID)
})
# needs to be in a observer to "listen" for events
observeEvent(input$mymap_marker_click, {
output$marker <- renderPrint(input$mymap_marker_click$id)
})
}
shinyApp(ui, server)