私はIDをグループ化することはまだ行く方法だと思います。そのグループ化変数をデータフレームに追加することができます。この変数を使用して、以下に示すようにポイントの表示/非表示を切り替えることができます。削除したいIDを特定する必要があったため、元々試していたものとまったく異なるものではありません。あなたはまだそれをしなくてはなりませんが、今ではそれらを定義されたグループに入れなければなりません。あなたが使用することができ
require(shiny)
require(leaflet)
require(dplyr)
ui <- shinyUI(fluidPage(
sidebarLayout(
sidebarPanel(
#Set value = TRUE so points are shown by default
checkboxInput("delete1", "Toggle ID 1 and 2", value = TRUE),
checkboxInput("delete3", "Toggle ID 3", value = TRUE)
),
mainPanel(
leafletOutput("map")
)
)
))
df <- data.frame(
id = c(1,2,3),
#Add grouping variable
group = c("one", "one", "two"),
lng = rnorm(3, -106.1039361, 0.5) ,
lat = rnorm(3, 50.543981, 0.5)
)
server <- shinyServer(function(input, output, session) {
output$map <- renderLeaflet(
leaflet() %>%
addTiles() %>%
#Add markers with group
addCircleMarkers(group = df$group, df$lng, df$lat, radius=2, fill = TRUE, color = 'red')
)
observeEvent(input$delete1, {
proxy <- leafletProxy('map')
#Always clear the group first on the observed event
proxy %>% clearGroup(group = "one")
#If checked
if (input$delete1){
#Filter for the specific group
df <- filter(df, group == "one")
#Add the specific group's markers
proxy %>% addCircleMarkers(group = df$group, df$lng, df$lat, radius=2, fill = TRUE, color = 'red')
}
})
#Repeat for the other groups
observeEvent(input$delete3, {
proxy <- leafletProxy('map')
proxy %>% clearGroup(group = "two")
if (input$delete3){
df <- filter(df, group == "two")
proxy %>% addCircleMarkers(group = df$group, df$lng, df$lat, radius=2, fill = TRUE, color = 'red')
}
})
})
shinyApp(ui, server)
もう一つのアイデアは、代わりにcheckboxInput
のあるあなたは1で倍数を選択することができますselectInput
です。それは各グループのためにobserveEvents
にする必要性を節約します。それは以下に示されています。私はそれを設定するので、デフォルトですべてのポイントが表示され、グループを選択するとプロットから削除されます。
require(shiny)
require(leaflet)
require(dplyr)
df <- data.frame(
id = c(1,2,3),
#Add grouping variable
group = c("one", "one", "two"),
lng = rnorm(3, -106.1039361, 0.5) ,
lat = rnorm(3, 50.543981, 0.5)
)
ui <- shinyUI(fluidPage(
sidebarLayout(
sidebarPanel(
#Set value = TRUE so points are shown by default
selectInput("toggle", "Toggle Groups", choices = unique(df$group), multiple = TRUE)
),
mainPanel(
leafletOutput("map")
)
)
))
server <- shinyServer(function(input, output, session) {
output$map <- renderLeaflet(
leaflet() %>%
addTiles() %>%
addCircleMarkers(df$lng, df$lat, radius=2, fill = TRUE, color = 'red')
)
observe({
proxy <- leafletProxy('map')
if(is.null(input$toggle)){
proxy %>% clearMarkers() %>%
addCircleMarkers(df$lng, df$lat, radius=2, fill = TRUE, color = 'red')
} else {
#Always clear the shapes on the observed event
proxy %>% clearMarkers()
#Filter for the specific group
df <- filter(df, !(group %in% input$toggle))
#Add the specific group's markers
proxy %>% addCircleMarkers(group = df$group, df$lng, df$lat, radius=2, fill = TRUE, color = 'red')
}
})
})
shinyApp(ui, server)
の例では、3人のIDのためであるとことを示すために、時には私はグループ化されたデータを追加/削除する必要があります。本当の問題には約100万のIDがあるので、別々のグループに入れることを避けたいと考えていました。 – DS501
あなたの例では、あなたがそれらを呼び出さなくてもグループに入れています。 'removeMarker(df [1:2,1])'はID1とID2をグループ化します。データフレーム内の変数を使ってそれらをグループ化すると、他の答えで示した 'selectInput'というアイデアを使って、たくさんの繰り返しコード(各グループに新しい' observeEvent'を使う必要がありません)を避けることができます。 – Jake