web-dev-qa-db-ja.com

光沢のあるリーフレットポリゴンクリックイベント

自然地球のウェブサイトからダウンロードしたbusinessという地図があります。ここでは、マップを表示する基本的なマップ出力を作成しています。ここでは主にadmin(国の名前)とeconomyの2つの列を使用しています。次に、uiの下にBusinessというドロップダウンリストを追加しました。国のポリゴンをクリックすると、リストが更新され、クリックしている国が表示されます。 p <- input$Map_shape_click shinyは、pがbusinessオブジェクトであることを知っているので、列adminがあり、このadmin IDを参照してBusinessドロップダウンリストを更新します。しかし、それは機能しません。リンクは私が見ているものを示しています-別の国をクリックしてもリストは更新されません。

enter image description here

server.r

country <- readOGR(dsn = tmp, layer = "ne_110m_admin_0_countries", encoding   = "UTF-8")
business<-country[country@data$admin %in% c("Brazil","Colombia","Panama","Kazakhstan","Argentina","India","","Chile","Dominican Republic","United Kingdom","El Salvador","United States of America"),]
business@data$category <- factor(sample.int(20L, nrow(business@data), FALSE))


shinyServer(function(input, output,session) {

output$Map <- renderLeaflet({
  factpal <- colorFactor(topo.colors(20), business@data$category)
  state_popup <- paste0("<strong>Name of the country </strong>", 
                        business$admin, 
                        "<br><strong> information is  </strong>", 
                        business$economy)
    leaflet() %>%
    addProviderTiles("CartoDB.Positron") %>%
    addPolygons(data=business,
                layerId=~admin,
                fillColor= ~factpal(category),
                fillOpacity = 0.7, 
                color = "#BDBDC3", 
                weight = 1, 
                popup = state_popup,
                highlight = highlightOptions(
                weight = 5,
                color = "#666",
                dashArray = "",
                fillOpacity = 0.7,
                bringToFront = TRUE))})


observeEvent(input$Map_shape_click, { # update the location selectInput on map clicks
  p <- input$Map_shape_click
  if(!is.null(p$admin)){
    if(is.null(input$Business) || input$Business!=p$admin) updateSelectInput(session, "Business", selected=p$admin)
  }
})
}
)

ui.r

navbarPage("Market Portal",
tabPanel("About",
           bootstrapPage(
             leafletOutput("Map",width="100%",height="800px"),
             absolutePanel(top=100, right=50,
             selectInput("Business", "Business", c("Brazil","Colombia","Panama","Kazakhstan","Argentina","India","Chile","Dominican Republic","United Kingdom","El Salvador","United States of America"), selected="")
))))
12
user3833612

リーフレットのclickイベントは、latlngおよびid(およびランダムな値)を返します。したがって、これらの要素の1つにしかアクセスできません。

idの値は、形状プロット関数で指定したlayerIdに関連するため、この場合はlayerId=~adminになります。

したがって、クリックのadminフィールドを介してid値にアクセスします

p$adminp$idに置き換えると、ソリューションが得られます。


clickイベントの内容を確認するには、その周りにprintステートメントを挿入します

observeEvent(input$Map_shape_click, { # update the location selectInput on map clicks
  p <- input$Map_shape_click
  print(p)
})

オブジェクトをコンソールに出力します。

14
SymbolixAU