【问题标题】:How can i add two different markers in the same Rshiny plot如何在同一个 Rshiny 图中添加两个不同的标记
【发布时间】:2015-11-13 10:46:04
【问题描述】:

我试图在同一个 Rshiny 图中包含两种不同类型的标记。第一个标记(addCircleMarkers)工作得很好,但是当我包含第二个标记(addMarkers)时,我收到了错误消息

我的数据框:

  Type Location.ID             Location_discription      Lat      Long Flood.path       FP_Icon Sample Structure.2
1 GBS_S         ALB                       Albany, OR 44.62054 -123.1039        Yes greenleafIcon     A1        Blue
2 GBS_S         ALB                       Albany, OR 44.62054 -123.1039        Yes greenleafIcon     A3        Blue
3 GBS_S         ALB                       Albany, OR 44.62054 -123.1039        Yes greenleafIcon     A4        Blue
4 GBS_S         ALB                       Albany, OR 44.62054 -123.1039        Yes greenleafIcon     A5        Blue
5 GBS_S         ANG Angels' rest, Columbia Gorge, OR 45.56383 -122.1523        Yes greenleafIcon   ANG1        Blue
6 GBS_S         ANG Angels' rest, Columbia Gorge, OR 45.56383 -122.1523        Yes greenleafIcon  ANG1b        Blue
  Structure.3
1       Green
2       Green
3       Green
4       Green
5       Green
6       Green

我的 ui.R

library(shiny)
library(leaflet)

shinyUI(fluidPage(

  # Application title
  titlePanel("Aspen GBS Population Structure results on map"),

  # Side bar layout
  sidebarLayout(
    sidebarPanel(
      selectInput("structure", label = "Select K for display", choices = c("2", "3", "4", "5", "6"), selected = "2"),
      radioButtons("origin", label = "Nature of the sample", choices = c("Flood", "Non Flood"), selected = "Flood")),

  mainPanel(
    leafletOutput("map")
  )
  )
)
)

我的服务器.R

greenleafIcon <- makeIcon(
  iconUrl = "http://leafletjs.com/docs/images/leaf-green.png",
  iconWidth = 20, iconHeight = 50,
  iconAnchorX = 12, iconAnchorY = 84,
  shadowUrl = "http://leafletjs.com/docs/images/leaf-shadow.png",
  shadowWidth = 40, shadowHeight = 54,
  shadowAnchorX = 3, shadowAnchorY = 52
)

redleafIcon <- makeIcon(
  iconUrl = "http://leafletjs.com/docs/images/leaf-red.png",
  iconWidth = 20, iconHeight = 50,
  iconAnchorX = 12, iconAnchorY = 84,
  shadowUrl = "http://leafletjs.com/docs/images/leaf-shadow.png",
  shadowWidth = 40, shadowHeight = 54,
  shadowAnchorX = 3, shadowAnchorY = 52
)

library(shiny)

shinyServer(function(input, output) {
    dt <- reactive(
        switch(input$structure,
              "2" = data_K2$Structure.2,
              "3" = data_K2$Structure.3))

    dt2 <- reactive(
      switch (input$origin,
        "Flood" = data_K2$FP_Icon,
        "Non Flood" = data_K2$FP_Icon))

    output$map <- renderLeaflet(
      leaflet(data = data_K2) %>% addTiles() %>% setView(lng = -106.1039361,lat = 50.543981, zoom = 4) %>% 
      addCircleMarkers(lat = ~Lat, lng = ~Long, popup = ~Location_discription, radius=2, color = ~dt(), fill = TRUE) %>%
      addMarkers(lat = ~Lat, lng = ~Long, popup = ~Location_discription, icon = ~dt2())
    )
})

我收到的错误消息是 - Error in icon$iconUrl : $ operator is invalid for atomic vectors

我在哪里做错了?

【问题讨论】:

  • 我不明白的是,如果你不使用其他任何地方,为什么你还有 greenleafIcon 和 redleafIcon
  • 我在数据框中的一列中使用了它们。请参阅我的数据框中的列 - FP_Icon
  • 这个帖子可以帮你解决问题stackoverflow.com/questions/23299684/…

标签: r shiny


【解决方案1】:

问题所在的行在这里:

addMarkers(lat = ~Lat, lng = ~Long, popup = ~Location_discription, icon = ~dt2())

特别是~dt2()。这计算为data_K2$FP_Icon,它是一个原子向量。向量不能用$ 进行子集化。 addMarkers 的 icon 参数需要一个具有子集 iconUrl 的对象,因此会出现错误。

我认为你想要的是:

leafIcons <- icons(
  iconUrl = ifelse(data_K2$FP_Icon == "greenleafIcon",
    "http://leafletjs.com/docs/images/leaf-green.png",
    "http://leafletjs.com/docs/images/leaf-red.png"
  ),
  iconWidth = 38, iconHeight = 95,
  iconAnchorX = 22, iconAnchorY = 94,
  shadowUrl = "http://leafletjs.com/docs/images/leaf-shadow.png",
  shadowWidth = 50, shadowHeight = 64,
  shadowAnchorX = 4, shadowAnchorY = 62
)

然后

addMarkers(lat = ~Lat, lng = ~Long, popup = ~Location_discription, icon = leafIcons

这里有非常有用且清晰的文档:https://rstudio.github.io/leaflet/markers.html

【讨论】:

  • 太棒了。有效。我有一个问题。现在addMarkers 的工作原理与第二个输入origin 无关。我怎样才能使这个originaddMarkers 集成?
  • @upendra 从你的代码中我不清楚它应该做什么。现在还没有效果,因为switch函数的两个输出是一样的
  • 我已经修改了我的问题以及代码。如果还不清楚,请告诉我。当我使用checkboxInput 时,我只想激活第二个标记(addmarker)
  • @upendra 我建议回滚您的编辑,因为您的问题的解决方案可能会帮助其他人。如果您打开一个新问题并将其链接到这里,我可以在那里回答它
  • 在高层次上,您想要做的是将iconUrl = ifelse(data_K2$FP_Icon == "greenleafIcon", 中的测试替换为用户表单输入,我认为leafIcons 需要具有响应性
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-28
  • 1970-01-01
相关资源
最近更新 更多