我可以在 r 中使用传单“map_shape_click”事件来用数据表填充 box() 吗?

JCB*_*JCB 3 datatable r leaflet shinydashboard

我已经在网络上搜索了几个星期,试图找到一个示例或代码来实现我想要用我的闪亮应用程序(shinydashboard)完成的任务。我\xe2\x80\x99m 是r 的新手,我\xe2\x80\x99m 开始认为我想做的事情是不可能的。我基本上有一个带有县多边形(shapefile)的传单地图,我想使用多边形上的单击事件在地图下方的 box() 上打开相关的数据表(物种表)。多边形数据是一个包含县名和县号 ID 的 shapefile。相关数据表包含县名称、县#id 和每个县的物种名称(一对多关系)。我在想如何使用 \xe2\x80\x9cmap_shape_click\xe2\x80\x9d 中的观察函数和县 # id 在输出框()上呈现按县列出物种名称的表。然而我不知道这是否可能。到目前为止,我已经能够创建地图并使用单击事件来捕获 box() 上的县名称(参见附图)。\n这个论坛太棒了,我从帖子中学到了很多东西。感谢所有为社区做出贡献的人。如果您对如何完成此任务有任何建议,请告诉我,\n谢谢

\n\n

柔佛州

\n\n

示例图像

\n

小智 6

让我看看我是否做对了..

您可以通过捕获与单击的多边形相关的信息,然后使用 id 对表进行子集化来获得所需的结果

library(raster)
library(shiny)
library(leaflet)
library(RColorBrewer)
library(DT)

#species per region
mydata<-data.frame(myID=c("Iburengerazuba", "Iburasirazuba","Umujyi wa 
Kigali","Umujyi wa Kigali", "Amajyaruguru", "Iburengerazuba", 
"Amajyaruguru", "Amajyaruguru"),
myspec=c("virginiana", "setosa", "barbosa", "pelosa",
"pudica","pudica","pudica","pudica"))

#load in shapefiles for state
states <- getData("GADM", country = "rwa", level = 1)

#define color palettes for states
statePal <- colorFactor("Dark2", states@data$NAME_1)


shinyApp(

  ui = fluidPage(
    leafletOutput('myMap', width = "100%"), 
    br(), 
    DT::dataTableOutput("mytable", width = "100%")
  ),

  server <- function(input, output, session){

    output$myMap <- renderLeaflet({
       leaflet() %>% 
        addTiles() %>% 
        addPolygons(data = states, 
                    fillColor = ~statePal(states@data$NAME_1), 
                    fillOpacity = 1, 
                    color = "white", 
                    stroke = T, 
                    weight = 1, 
                    layerId = states@data$NAME_1) 
    }) 

    observeEvent(input$myMap_shape_click, {

      #capture the info of the clicked polygon
      click <- input$myMap_shape_click

      #subset your table with the id of the clicked polygon 
      selected <- mydata[mydata$myID == click$id,]

      #if click id isn't null render the table
      if(!is.null(click$id)){
        output$mytable = DT::renderDataTable({
          selected
        }) 
      } 
    }) 
  }) 
Run Code Online (Sandbox Code Playgroud)