答えはlayerIdsにあります。私はこれらがどのようにポリゴンに適用され、形状を取り除くのか理解していませんでした。これが重要です。これは最も洗練されたソリューションではないかもしれませんが、それは仕事を完了させます!
ルワンダの初期地図レンダリングではlayerId
が[email protected]$NAME_1
で、地域名です。 label
も[email protected]$NAME_1
と設定されています。したがって、下の画像では、左端のポリゴンは、NAME_1
の列にあるIburengerazubaというラベルが付けられています。 このレイヤーIDは、この最初のマップレンダリングでのクリックイベントに対して、click$id
を設定します。したがって、このポリゴンはIburengerazubaとラベルされているように、そのclick$id
もIburengerazubaとして設定されます。 As stated in the Leaflet Shiny documentation、複数のポリゴンがある場合は、ベクトル化された引数である必要があります。 1つのポリゴン(この例では一度に1つの領域のみ)を選択したり選択解除する必要がある場合は、layerId = "selected"
のようにlayerId
文字列を使用することができます。
次はあなたの形状クリックためobserveEvent
です。 Thanks to the help of user @John Paul、地図上に作成されたすべてのクリックイベント(この場合はクリックID)を保存する方法を理解しました。私はそれらを無効ベクトルに保存してから、そのクリックIDでシェイプファイルをサブセット化しました。コードはかなり徹底的にコメントされているので、うまくいけば、この同じ解決策を探している人は、何が起こっているのかを正確に把握することができます。
最後のコードビット(if...else
の条件文に格納されています)はおそらく最も混乱します。最初にコードのelse
部分を見てみましょう。 (注:初めてのクリックではif
の条件を満たす方法がないため、最初の地図クリックでこのイベントがトリガーされます)。白いポリゴンがクリックされた場合は、addPolygons()
呼び出しがトリガーされ、クリックされたポリゴンが地図に追加されます別のスタイリング(この場合は赤です)を使用します。 これは、全く異なるポリゴンをleafletProxy
オブジェクトの上にプロットしています!
赤を削除するための鍵は、これらのポリゴンに初期マップのレンダリングとは異なるlayerId
を与えているポリゴンをクリックしました。上記の画像では、Iburengerazubaというラベルの付いた白いポリゴンは3とラベル付けされています。これは、コールのlayerId
がCCA_1
INSTEAD OF NAME_1
に設定されているためです。下層の白いマップにはNAME_1のレイヤIDがあり、そのためNAME_1のクリックIDがあります。赤いクリックされたポリゴンの上にプロットされた赤いクリックポリゴンのCCA_1レイヤIDはCCA_1のクリックIDです。
if
ステートメントには、が既にclickedPolys
ポリゴンに存在する場合、このシェイプが削除されると記載されています。これは紛らわしいので、コードの各行を辿って真に理解するのに役立ちます。
もう一度上記の例を使用して、左端のポリゴンをクリックすると、ベクターにlayerId
Iburengerazubaが追加されます。このクリックイベントは、クリックされたポリゴンを別のスタイルで描画し、layerId
が3(CCA_1
列から)にプロットした2番目のマップ描画をトリガーします。赤いポリゴンが2回クリックされた場合(if(click$id %in% [email protected]$CCA_1)
)、選択解除としてカウントされ、そのポリゴンをマップから削除する必要があります。したがって、layerId
が3の赤い左端のポリゴンをクリックすると、clickedIds$ids
ベクトルはIburengerazuba
と3
となります。 のclickedPolys
ポリゴンのIburengerazubaはCCA_1
列の3に対応し、if
をトリガします。 removeShape(layerId = click$id)
というコールは、そのクリック$ idに対応する図形を削除することを意味します。したがって、この場合には、3
のCCA_1
layerId
とclickedPolys
ポリゴンがすべてのクリックIDことを覚えておいてください、NAME_1
とCCA_1
の両方があなたのclickedIds$ids
ベクトルに記録されています。このベクトルは、ルワンダのシェイプファイルをサブセット化して、クリックされたすべてのポリゴンをマップします。ポリゴンをクリックすると、clickedPolys
ポリゴンは動的に更新されます。print
を呼び出すと、これが意味をなさない場合はすべてのビットをチェックします。ダブルクリックされた図形を削除するだけでは、すべてを正確にプロットするには不十分です。clickedIds$ids
ベクトルから、選択解除されたlayerIds(NAME_1とCCA_1)を削除する必要があります。私は、選択されていないそれぞれのCCA_1 layerId
を対応するNAME_1
の値にマッチさせ、clickedIds$ids
ベクトルからこれらの属性を削除して、clickedPolys
ポリゴンから削除しました。
Voila!これで、必要なポリゴンを選択したり選択解除したりできます。
library(raster)
library(shiny)
library(leaflet)
#load shapefile
rwa <- getData("GADM", country = "RWA", level = 1)
shinyApp(
ui = fluidPage(
leafletOutput("map")
),
server <- function(input, output, session){
#create empty vector to hold all click ids
clickedIds <- reactiveValues(ids = vector())
#initial map output
output$map <- renderLeaflet({
leaflet() %>%
addTiles() %>%
addPolygons(data = rwa,
fillColor = "white",
fillOpacity = 1,
color = "black",
stroke = T,
weight = 1,
layerId = [email protected]$NAME_1,
group = "regions",
label = [email protected]$NAME_1)
}) #END RENDER LEAFLET
observeEvent(input$map_shape_click, {
#create object for clicked polygon
click <- input$map_shape_click
#define leaflet proxy for second regional level map
proxy <- leafletProxy("map")
#append all click ids in empty vector
clickedIds$ids <- c(clickedIds$ids, click$id)
#shapefile with all clicked polygons - original shapefile subsetted by all admin names from the click list
clickedPolys <- rwa[[email protected]$NAME_1 %in% clickedIds$ids, ]
#if the current click ID [from CCA_1] exists in the clicked polygon (if it has been clicked twice)
if(click$id %in% [email protected]$CCA_1){
#define vector that subsets NAME that matches CCA_1 click ID
nameMatch <- [email protected]$NAME_1[[email protected]$CCA_1 == click$id]
#remove the current click$id AND its name match from the clickedPolys shapefile
clickedIds$ids <- clickedIds$ids[!clickedIds$ids %in% click$id]
clickedIds$ids <- clickedIds$ids[!clickedIds$ids %in% nameMatch]
#remove that highlighted polygon from the map
proxy %>% removeShape(layerId = click$id)
} else {
#map highlighted polygons
proxy %>% addPolygons(data = clickedPolys,
fillColor = "red",
fillOpacity = 1,
weight = 1,
color = "black",
stroke = T,
label = [email protected]$CCA_1,
layerId = [email protected]$CCA_1)
} #END CONDITIONAL
}) #END OBSERVE EVENT
}) #END SHINYAPP