selectInput 在我的传单地图闪亮应用程序中没有正确响应操作按钮
selectInput is not responding to action button properly in my leaflet map shiny app
我需要用 leaflet 包创建一个交互式地图,我可以在其中使用 selectInput
来控制在地图上显示哪些数据点。我还想使用图层控制按钮 select 一个或两个图层(数据点)出现在地图上。我的代码如下所示。
我希望地图仅在单击 go
按钮时响应 selectInput
。
当我 select selectInput
中的一项时,我的代码有效(单击 go
时地图会刷新)。
我发现当我 select 第二项时,最初我看到错误:subscript out of bounds
。单击 go
时,两个标记都会出现。
当我删除两项 selected 中的一项时,地图会在单击操作按钮之前做出响应。
selectInput
似乎没有正确响应 action button
。有谁知道为什么会这样?我做错了什么?我花了几个小时试图弄清楚但没有运气......提前致谢。
library(shiny)
library(leaflet)
hotels <- read.table(text = "Hotel Year latitude longitude
A 2000 41.886337 -87.628472
B 2005 41.88819 -87.635199
C 2010 41.891113 -87.63301",
header = TRUE)
ui <- fluidPage(
selectizeInput(inputId = 'year', label='Choose Year:',
choices = c(2000,2005,2010),
multiple=TRUE,
options = list(
maxItems = 2,
placeholder = '',
onInitialize = I("function() { this.setValue(''); }"))),
actionButton("go", "go"),
leafletOutput("mymap")
)
server <- function(input, output, session) {
df_list = reactive ({
input$go
isolate(
if (length(input$year)>1) {
list(hotels[hotels$Year == input$year[1],],
hotels[hotels$Year == input$year[2],])
} else {
list(hotels[hotels$Year == input$year[1],])
}
)
})
output$mymap <- renderLeaflet({
map = leaflet() %>%
addProviderTiles("OpenStreetMap.Mapnik") %>%
addCircleMarkers( data = df_list()[[1]] ,
group = 'Data Markers 1',
lng = ~longitude,
lat = ~latitude,
radius = 10,
stroke = F,
fillOpacity = 0.9,
color = 'red')
if ( length(input$year)>1){
map = map %>%
addCircleMarkers( data = df_list()[[2]] ,
group = 'Data Markers 2',
lng = ~longitude,
lat = ~latitude,
radius = 10,
stroke = F,
fillOpacity = 0.9,
color = 'blue')
}
if ( length(input$year)>1) {
map = map %>%
addLayersControl(
overlayGroups = c('Data Markers 1', 'Data Markers 2'),
options = layersControlOptions(collapsed = FALSE) )
} else {
map = map %>%
addLayersControl(
overlayGroups = c('Data Markers 1'),
options = layersControlOptions(collapsed = FALSE) )
}
})
}
shinyApp(ui, server)
要点是您在使用操作按钮时应该使用 observeEvent()
。您混淆了反应路径,因此值未按您假设的顺序更改。
library(shiny)
library(leaflet)
hotels <- read.table(text = "Hotel Year latitude longitude
A 2000 41.886337 -87.628472
B 2005 41.88819 -87.635199
C 2010 41.891113 -87.63301",
header = TRUE)
ui <- fluidPage(
selectizeInput(inputId = 'year', label='Choose Year:',
choices = c(2000,2005,2010),
multiple=TRUE,
options = list(
maxItems = 2,
placeholder = '',
onInitialize = I("function() { this.setValue(''); }"))),
actionButton("go", "go"),
leafletOutput("mymap")
)
server <- function(input, output, session) {
# use the button for observeEvent
# ignore values ensure an empty map is loading in the beginning
observeEvent(input$go, ignoreInit = FALSE, ignoreNULL = FALSE, {
# no need for a reactive list here
if (length(input$year)>1) {
df_list <- list(hotels[hotels$Year == input$year[1],],
hotels[hotels$Year == input$year[2],])
} else {
df_list <- list(hotels[hotels$Year == input$year[1],])
}
output$mymap <- renderLeaflet({
map <- leaflet() %>%
addProviderTiles("OpenStreetMap.Mapnik") %>%
addCircleMarkers( data = df_list[[1]] ,
group = 'Data Markers 1',
lng = ~longitude,
lat = ~latitude,
radius = 10,
stroke = F,
fillOpacity = 0.9,
color = 'red')
# not using input does not invoke reactiveness
if ( length(df_list) > 1){
map <- map %>%
addCircleMarkers( data = df_list[[2]] ,
group = 'Data Markers 2',
lng = ~longitude,
lat = ~latitude,
radius = 10,
stroke = F,
fillOpacity = 0.9,
color = 'blue')
}
if ( length(input$year)>1) {
map <- map %>%
addLayersControl(
overlayGroups = c('Data Markers 1', 'Data Markers 2'),
options = layersControlOptions(collapsed = FALSE) )
} else {
map <- map %>%
addLayersControl(
overlayGroups = c('Data Markers 1'),
options = layersControlOptions(collapsed = FALSE) )
}
map
})
})
}
shinyApp(ui, server)
注意:而是使用赋值箭头进行赋值 ;)
我需要用 leaflet 包创建一个交互式地图,我可以在其中使用 selectInput
来控制在地图上显示哪些数据点。我还想使用图层控制按钮 select 一个或两个图层(数据点)出现在地图上。我的代码如下所示。
我希望地图仅在单击 go
按钮时响应 selectInput
。
当我 select selectInput
中的一项时,我的代码有效(单击 go
时地图会刷新)。
我发现当我 select 第二项时,最初我看到错误:subscript out of bounds
。单击 go
时,两个标记都会出现。
当我删除两项 selected 中的一项时,地图会在单击操作按钮之前做出响应。
selectInput
似乎没有正确响应 action button
。有谁知道为什么会这样?我做错了什么?我花了几个小时试图弄清楚但没有运气......提前致谢。
library(shiny)
library(leaflet)
hotels <- read.table(text = "Hotel Year latitude longitude
A 2000 41.886337 -87.628472
B 2005 41.88819 -87.635199
C 2010 41.891113 -87.63301",
header = TRUE)
ui <- fluidPage(
selectizeInput(inputId = 'year', label='Choose Year:',
choices = c(2000,2005,2010),
multiple=TRUE,
options = list(
maxItems = 2,
placeholder = '',
onInitialize = I("function() { this.setValue(''); }"))),
actionButton("go", "go"),
leafletOutput("mymap")
)
server <- function(input, output, session) {
df_list = reactive ({
input$go
isolate(
if (length(input$year)>1) {
list(hotels[hotels$Year == input$year[1],],
hotels[hotels$Year == input$year[2],])
} else {
list(hotels[hotels$Year == input$year[1],])
}
)
})
output$mymap <- renderLeaflet({
map = leaflet() %>%
addProviderTiles("OpenStreetMap.Mapnik") %>%
addCircleMarkers( data = df_list()[[1]] ,
group = 'Data Markers 1',
lng = ~longitude,
lat = ~latitude,
radius = 10,
stroke = F,
fillOpacity = 0.9,
color = 'red')
if ( length(input$year)>1){
map = map %>%
addCircleMarkers( data = df_list()[[2]] ,
group = 'Data Markers 2',
lng = ~longitude,
lat = ~latitude,
radius = 10,
stroke = F,
fillOpacity = 0.9,
color = 'blue')
}
if ( length(input$year)>1) {
map = map %>%
addLayersControl(
overlayGroups = c('Data Markers 1', 'Data Markers 2'),
options = layersControlOptions(collapsed = FALSE) )
} else {
map = map %>%
addLayersControl(
overlayGroups = c('Data Markers 1'),
options = layersControlOptions(collapsed = FALSE) )
}
})
}
shinyApp(ui, server)
要点是您在使用操作按钮时应该使用 observeEvent()
。您混淆了反应路径,因此值未按您假设的顺序更改。
library(shiny)
library(leaflet)
hotels <- read.table(text = "Hotel Year latitude longitude
A 2000 41.886337 -87.628472
B 2005 41.88819 -87.635199
C 2010 41.891113 -87.63301",
header = TRUE)
ui <- fluidPage(
selectizeInput(inputId = 'year', label='Choose Year:',
choices = c(2000,2005,2010),
multiple=TRUE,
options = list(
maxItems = 2,
placeholder = '',
onInitialize = I("function() { this.setValue(''); }"))),
actionButton("go", "go"),
leafletOutput("mymap")
)
server <- function(input, output, session) {
# use the button for observeEvent
# ignore values ensure an empty map is loading in the beginning
observeEvent(input$go, ignoreInit = FALSE, ignoreNULL = FALSE, {
# no need for a reactive list here
if (length(input$year)>1) {
df_list <- list(hotels[hotels$Year == input$year[1],],
hotels[hotels$Year == input$year[2],])
} else {
df_list <- list(hotels[hotels$Year == input$year[1],])
}
output$mymap <- renderLeaflet({
map <- leaflet() %>%
addProviderTiles("OpenStreetMap.Mapnik") %>%
addCircleMarkers( data = df_list[[1]] ,
group = 'Data Markers 1',
lng = ~longitude,
lat = ~latitude,
radius = 10,
stroke = F,
fillOpacity = 0.9,
color = 'red')
# not using input does not invoke reactiveness
if ( length(df_list) > 1){
map <- map %>%
addCircleMarkers( data = df_list[[2]] ,
group = 'Data Markers 2',
lng = ~longitude,
lat = ~latitude,
radius = 10,
stroke = F,
fillOpacity = 0.9,
color = 'blue')
}
if ( length(input$year)>1) {
map <- map %>%
addLayersControl(
overlayGroups = c('Data Markers 1', 'Data Markers 2'),
options = layersControlOptions(collapsed = FALSE) )
} else {
map <- map %>%
addLayersControl(
overlayGroups = c('Data Markers 1'),
options = layersControlOptions(collapsed = FALSE) )
}
map
})
})
}
shinyApp(ui, server)
注意:而是使用赋值箭头进行赋值 ;)