我正在制作一个使用闪亮的应用程序,该应用程序使用多个选项卡。在一个选项卡(不是起始选项卡)上,我显示一张传单地图,该地图由不同选项卡上的小部件控制。
问题是,如果我更改一个选项卡上的输入,而不先访问地图,然后访问地图,则地图不会更新。但是,在地图选项卡之后或期间更改输入,地图会更新。
要复制该问题:
observe()没有被触发(注意观察被触发但没有效果),或者传单没有渲染)同样,当应用程序启动并且我们直接转到地图时,我希望会显示一个红点。相反,没有点。
代码:
library(shiny)
library(leaflet)
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
selectInput("color", "Color", choices = c("red", "blue", "yellow", "green"))
),
mainPanel(
tabsetPanel(
tabPanel("Other", h1("Empty Tab 1")),
tabPanel("Map", leafletOutput("map"))
)
)
)
)
server <- function(input, output, session) {
# the base map and the circles are separated due to data restrictions
# in the actual app!
output$map <- renderLeaflet({
leaflet() %>%
addTiles()
})
observe({
leafletProxy("map") %>%
addCircles(lng = 0, lat = 0, radius = 3e6, color = input$color)
})
}
shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)
我怀疑这leafletProxy不起作用,因为传单小部件尚未在步骤 2 中呈现。
在我的现实应用程序中,第一个选项卡允许用户上传数据,而第二个选项卡使用传单显示数据,因此传单地图在实际渲染之前会被更新和配置......
请注意,由于各种原因(传单的大小、依赖于其他反应值、场景等),一次性创建传单(在observe()没有中创建地图)不是一种选择。leafletProxy
这适用于将输出选项suspendWhenHidden设置为FALSE并通过添加对观察者中选项卡集的依赖项:
library(shiny)
library(leaflet)
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
selectInput("color", "Color", choices = c("red", "blue", "yellow", "green"))
),
mainPanel(
tabsetPanel(
tabPanel("Other", h1("Empty Tab 1")),
tabPanel("Map", leafletOutput("map")),
id = "tabset"
)
)
)
)
server <- function(input, output, session) {
output$map <- renderLeaflet({
leaflet() %>%
addTiles()
})
outputOptions(output, "map", suspendWhenHidden = FALSE)
proxy <- leafletProxy("map")
observeEvent(list(input$tabset, input$color), {
proxy %>%
addCircles(lng = 0, lat = 0, radius = 3e6, color = input$color)
})
}
shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)