gpt4 book ai didi

r - 使用 Shiny 在 Markdown 中的不同选项卡上同步两个传单 map

转载 作者:行者123 更新时间:2023-12-04 03:22:26 25 4
gpt4 key购买 nike

在不同选项卡上同步两个传单 map 时遇到问题。

查看以前的条目 ( Synchronizing two leaflet maps in R / Rmarkdown ) 后,@TimSalabim 提供的解决方案不起作用,因为 map 位于不同的选项卡上。

这是一个 MWE RMarkdown 示例:

---
title: "QuestionforStackOverflow"
output:
flexdashboard::flex_dashboard:
runtime: shiny
---

```{r setup, include=FALSE}
library(flexdashboard)
library(shiny)
library(leaflet)
```

Tab One
======================================================================
```{r tab1}
output$map1 <-
renderLeaflet(
leaflet() %>%
addProviderTiles("CartoDB.Positron") %>%
setView(-93.65, 42.0285, zoom = 4)
)

leafletOutput("map1")

```
Tab Two
======================================================================
```{r tab2}

output$map2 <-
renderLeaflet(
leaflet() %>%
addProviderTiles("CartoDB.Positron") %>%
setView(-93.65, 42.0285, zoom = 4)
)

leafletOutput("map2")
```

我想要两种方式的改变。对 map1 的任何 View 更改 -- 更改 map2 或对 map2 的任何更改都将更改 map1。

理想情况下:如果您在 map 1 上滚动到圣路易斯, map 2 将在圣路易斯具有相同的缩放级别。

目前,两张 map 之间没有交互性。有没有办法让它们同步?

最佳答案

您可以使用 leafletProxy()为了这 :
请参阅此处的帮助:https://rstudio.github.io/leaflet/shiny.html

对于您的特定问题,这里有一个想法:

---
title: "QuestionforStackOverflow"
output:
flexdashboard::flex_dashboard:
runtime: shiny
---

```{r setup, include=FALSE}
library(flexdashboard)
library(shiny)
library(leaflet)
```

Tab One
======================================================================

```{r tab1}
output$map1 <-
renderLeaflet(
leaflet() %>%
addProviderTiles("CartoDB.Positron") %>%
setView(-93.65, 42.0285, zoom = 4)
)

actionButton("syncMap1", "Fit to map2 bounds")
leafletOutput("map1")

observeEvent(input$syncMap1,{
map2coords <- input$map2_bounds
map1Proxy <- leafletProxy("map1")
map1Proxy %>% fitBounds(lng1 = map2coords$east,
lat1 = map2coords$north,
lng2 = map2coords$west,
lat2 = map2coords$south)
})
```

Tab Two
======================================================================

```{r tab2}

output$map2 <-
renderLeaflet(
leaflet() %>%
addProviderTiles("CartoDB.Positron") %>%
setView(-93.65, 42.0285, zoom = 4)
)
actionButton("syncMap2", "Fit to map1 bounds")
leafletOutput("map2")

observeEvent(input$syncMap2,{
map1coords <- input$map1_bounds
map2Proxy <- leafletProxy("map2")
map2Proxy %>% fitBounds(lng1 = map1coords$east,
lat1 = map1coords$north,
lng2 = map1coords$west,
lat2 = map1coords$south)
})
```

这个想法是在单击按钮时检索其他 map 的坐标,然后同步 View 。

小问题: View 没有很好地同步:可以更好地找到显示 map 的质心并使用 setView()使用 input$map1_zoom .

主要问题:这意味着使用按钮,这不是用户友好的。
理论上,您可以使用 observe()块以将每个 map 的坐标反射(reflect)到另一个。试过了,它有很多问题,可能是因为一些“无限”循环,因为坐标有微小的变化。

关于r - 使用 Shiny 在 Markdown 中的不同选项卡上同步两个传单 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38023085/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com