在访问选项卡之前,另一个选项卡中的传单未使用 leafletproxy 更新

Leaflet in another tab not updated with leafletproxy before visiting tab

我正在使用 shiny 制作一个使用多个选项卡的应用程序。在一个选项卡(不是起始选项卡)上,我显示了一张传单地图,它由不同选项卡上的小部件控制。

问题是,如果我更改了一个选项卡上的输入,而不是先访问地图,然后再访问地图,则地图不会更新。但是,在地图选项卡上之后或同时更改输入,地图会更新。

重现问题:

  1. 运行以下代码
  2. 将输入颜色更改为蓝色(无需先访问地图选项卡!)
  3. 转到“地图”选项卡
    • 预期行为:蓝点。实际行为:无点(尚未绘制,好像 observe() 没有被触发(注意 observe 被触发但没有效果),或者传单没有呈现)
  4. 将颜色更改为黄色
    • 出现黄点
  5. 转到“其他”选项卡并将颜色更改为绿色
  6. 返回“地图”选项卡并看到一个绿点

同样,当应用程序启动并直接转到地图时,我希望显示一个红点。而是没有点。

代码:

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)

我怀疑 leafletProxy 不起作用,因为传单小部件尚未在步骤 2 中呈现。

知道如何解决这个问题吗?

在我的真实应用程序中,第一个选项卡允许用户上传数据,而第二个选项卡使用传单显示数据,因此传单地图在实际呈现之前得到更新和配置...

请注意,由于各种原因(传单的大小,取决于其他反应值),一次性创建传单(在没有 leafletProxyobserve() 中创建地图)不是一种选择、场景等)。

这适用于将输出选项 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)