【问题标题】:Conflict when generating addPolylines on the map made by LeafletLeaflet制作的地图上生成addPolylines时发生冲突
【发布时间】:2020-05-16 01:22:06
【问题描述】:

朋友,您能帮我解决以下问题吗:我在插入 addPolylines 函数以生成我的第二张传单地图时遇到了冲突。通常,地图 1 涉及显示所有集群,而地图 2 涉及特定集群。对于这个特定的集群,我插入了一个特征来保持与 map1 上形成的集群相同的颜色。第一个代码正确地执行了上述描述。但是,我还插入了第二个代码,该代码引用了第二个地图的 addPolylines。但是当我在第一个代码中插入第二个代码时,在涉及映射 2 生成的部分,它给出了一个错误:Warning: Error in eval: object 'm2' not found。你能帮我解决这个问题吗?

library(shiny)
library(ggplot2)
library(rdist)
library(geosphere)
library(shinythemes)
library(leaflet)

function.cl<-function(df,k,Filter1,Filter2){

  #database df
  df<-structure(list(Properties = c(1,2,3,4,5,6,7), 
                     Latitude = c(-23.8, -23.8, -23.9, -23.9, -23.9,-23.4,-23.5), 
                     Longitude = c(-49.6, -49.3, -49.4, -49.8, -49.6,-49.4,-49.2), 
                     Waste = c(526, 350, 526, 469, 285, 433, 456)), class = "data.frame", row.names = c(NA, -7L))


  #clusters
  coordinates<-df[c("Latitude","Longitude")]
  d<-as.dist(distm(coordinates[,2:1]))
  fit.average<-hclust(d,method="average") 
  clusters<-cutree(fit.average, k) 
  nclusters<-matrix(table(clusters))  
  df$cluster <- clusters 

  #specific cluster and specific propertie
  df1<-df[c("Latitude","Longitude")]
  df1$cluster<-as.factor(clusters)
  df_spec_clust <- df1[df1$cluster == Filter1,]
  df_spec_prop<-df[df$Properties==Filter2,]

  #Table to join df and df1
  data_table <- Reduce(merge, list(df, df1))

  #Color and Icon for map
  ai_colors <-c("red","gray","blue","orange","green","beige","darkgreen","lightgreen", "lightred", "darkblue","lightblue",
                "purple","darkpurple","pink", "cadetblue","white","darkred", "lightgray","black")
  clust_colors <- ai_colors[df$cluster]
  icons <- awesomeIcons(
    icon = 'ios-close',
    iconColor = 'black',
    library = 'ion',
    markerColor =  clust_colors)

  leafIcons <- icons(
    iconUrl = ifelse(df1$Properties,
                     "https://image.flaticon.com/icons/svg/542/542461.svg"
    ),
    iconWidth = 45, iconHeight = 40,
    iconAnchorX = 25, iconAnchorY = 12)
  html_legend <- "<img src='https://image.flaticon.com/icons/svg/542/542461.svg'>"

  # Map for all clusters:
  m1<-leaflet(df1) %>% addTiles() %>%
    addMarkers(~Longitude, ~Latitude, icon = leafIcons) %>%
    addAwesomeMarkers(lat=~df$Latitude, lng = ~df$Longitude, icon=icons, label=~as.character(df$cluster)) %>% 
    addPolylines(lat=~df$Latitude, lng = ~df$Longitude,color="red") %>% 
    addLegend( position = "topright", title="Cluster", colors = ai_colors[1:max(df$cluster)],labels = unique(df$cluster))

  plot1<-m1

  # Map for specific cluster and propertie
  if(nrow(df_spec_clust)>0){
    clust_colors <- ai_colors[df_spec_clust$cluster]
    icons <- awesomeIcons(
      icon = 'ios-close',
      iconColor = 'black',
      library = 'ion',
      markerColor =  clust_colors)
    m2<-leaflet(df_spec_clust) %>% addTiles() %>%
      addAwesomeMarkers(lat=~Latitude, lng = ~Longitude, icon=icons, label=~cluster) 
    plot2<-m2} else plot2 <- NULL   

  return(list(
    "Plot1" = plot1,
    "Plot2" = plot2,
    "Data" = data_table
  ))
}

ui <- bootstrapPage(
  navbarPage(theme = shinytheme("flatly"), collapsible = TRUE,
             "Cl", 
             tabPanel("Solution",
                      sidebarLayout(
                        sidebarPanel(
                          tags$b(h3("Choose the cluster number?")),
                          sliderInput("Slider", h5(""),
                                      min = 2, max = 5, value = 3),
                        ),
                        mainPanel(
                          tabsetPanel(      
                            tabPanel("Solution", (leafletOutput("Leaf1",width = "95%", height = "600")))))

                      ))),
  tabPanel("",
           sidebarLayout(
             sidebarPanel(
               selectInput("Filter1", label = h4("Select just one cluster to show"),""),
               selectInput("Filter2",label=h4("Select the cluster property designated above"),""),
             ),
             mainPanel(
               tabsetPanel(
                 tabPanel("Map", (leafletOutput("Leaf2",width = "95%", height = "600")))))
           )))

server <- function(input, output, session) {

  Modelcl<-reactive({
    function.cl(df,input$Slider,input$Filter1,input$Filter2)
  })

  output$Leaf1 <- renderLeaflet({
    Modelcl()[[1]]
  })

  output$Leaf2 <- renderLeaflet({
    Modelcl()[[2]]
  })

  observeEvent(input$Slider, {
    abc <- req(Modelcl()$Data)
    updateSelectInput(session,'Filter1',
                      choices=sort(unique(abc$cluster)))
  }) 

  observeEvent(input$Filter1,{
    abc <- req(Modelcl()$Data) %>% filter(cluster == as.numeric(input$Filter1))
    updateSelectInput(session,'Filter2',
                      choices=sort(unique(abc$Properties)))
  }) 


}

shinyApp(ui = ui, server = server)

在第二个地图中插入 addPolyline 的代码

for(i in 1:nrow(df_spec_clust)){
    df_line <- rbind(df_spec_prop[,c("Latitude","Longitude")],
                     df_spec_clust[i,c("Latitude","Longitude")])
    m2 <- m2 %>%
      addPolylines(data = df_line, 
                   lat=~Latitude, 
                   lng = ~Longitude,
                   color="red")
  }
  plot2<-m2

当我将第二个代码插入到第一个关于生成地图 2 的代码中时:

 # Map for specific cluster and propertie
      if(nrow(df_spec_clust)>0){
        clust_colors <- ai_colors[df_spec_clust$cluster]
        icons <- awesomeIcons(
          icon = 'ios-close',
          iconColor = 'black',
          library = 'ion',
          markerColor =  clust_colors)
        m2<-leaflet(df_spec_clust) %>% addTiles() %>%
          addAwesomeMarkers(lat=~Latitude, lng = ~Longitude, icon=icons, label=~cluster) 
        plot2<-m2} else plot2 <- NULL   

for(i in 1:nrow(df_spec_clust)){
        df_line <- rbind(df_spec_prop[,c("Latitude","Longitude")],
                         df_spec_clust[i,c("Latitude","Longitude")])
        m2 <- m2 %>%
          addPolylines(data = df_line, 
                       lat=~Latitude, 
                       lng = ~Longitude,
                       color="red")
      }
      plot2<-m2

出现如下错误:Warning: E​​rror in eval: object 'm2' not found.```

非常感谢!

【问题讨论】:

    标签: r shiny leaflet


    【解决方案1】:

    您必须在if 语句中插入代码:

    # Map for specific cluster and propertie
    if(nrow(df_spec_clust)>0){
        clust_colors <- ai_colors[df_spec_clust$cluster]
        icons <- awesomeIcons(
            icon = 'ios-close',
            iconColor = 'black',
            library = 'ion',
            markerColor =  clust_colors)
        m2<-leaflet(df_spec_clust) %>% addTiles() %>%
            addAwesomeMarkers(lat=~Latitude, lng = ~Longitude, icon=icons, label=~cluster) 
    
        for(i in 1:nrow(df_spec_clust)){
            df_line <- rbind(df_spec_prop[,c("Latitude","Longitude")],
                             df_spec_clust[i,c("Latitude","Longitude")])
            m2 <- m2 %>%
                addPolylines(data = df_line, 
                             lat=~Latitude, 
                             lng = ~Longitude,
                             color="red")
        }
        plot2<-m2} else plot2 <- NULL   
    

    【讨论】:

      【解决方案2】:
      library(shiny)
      library(ggplot2)
      library(rdist)
      library(geosphere)
      library(shinythemes)
      library(leaflet)
      
      function.cl<-function(df,k,Filter1,Filter2){
      
        #database df
        df<-structure(list(Properties = c(1,2,3,4,5,6,7), 
                           Latitude = c(-23.8, -23.8, -23.9, -23.9, -23.9,-23.4,-23.5), 
                           Longitude = c(-49.6, -49.3, -49.4, -49.8, -49.6,-49.4,-49.2), 
                           Waste = c(526, 350, 526, 469, 285, 433, 456)), class = "data.frame", row.names = c(NA, -7L))
      
      
        #clusters
        coordinates<-df[c("Latitude","Longitude")]
        d<-as.dist(distm(coordinates[,2:1]))
        fit.average<-hclust(d,method="average") 
        clusters<-cutree(fit.average, k) 
        nclusters<-matrix(table(clusters))  
        df$cluster <- clusters 
      
        #specific cluster and specific propertie
        df1<-df[c("Latitude","Longitude")]
        df1$cluster<-as.factor(clusters)
        df_spec_clust <- df1[df1$cluster == Filter1,]
        df_spec_prop<-df[df$Properties==Filter2,]
      
        #Table to join df and df1
        data_table <- Reduce(merge, list(df, df1))
      
        #Color and Icon for map
        ai_colors <-c("red","gray","blue","orange","green","beige","darkgreen","lightgreen", "lightred", "darkblue","lightblue",
                      "purple","darkpurple","pink", "cadetblue","white","darkred", "lightgray","black")
        clust_colors <- ai_colors[df$cluster]
        icons <- awesomeIcons(
          icon = 'ios-close',
          iconColor = 'black',
          library = 'ion',
          markerColor =  clust_colors)
      
        leafIcons <- icons(
          iconUrl = ifelse(df1$Properties,
                           "https://image.flaticon.com/icons/svg/542/542461.svg"
          ),
          iconWidth = 45, iconHeight = 40,
          iconAnchorX = 25, iconAnchorY = 12)
        html_legend <- "<img src='https://image.flaticon.com/icons/svg/542/542461.svg'>"
      
        # Map for all clusters:
        m1<-leaflet(df1) %>% addTiles() %>%
          addMarkers(~Longitude, ~Latitude, icon = leafIcons) %>%
          addAwesomeMarkers(lat=~df$Latitude, lng = ~df$Longitude, icon=icons, label=~as.character(df$cluster)) %>% 
          addPolylines(lat=~df$Latitude, lng = ~df$Longitude,color="red") %>% 
          addLegend( position = "topright", title="Cluster", colors = ai_colors[1:max(df$cluster)],labels = unique(df$cluster))
      
        plot1<-m1
      
        # Map for specific cluster and propertie
        if(nrow(df_spec_clust)>0){
          clust_colors <- ai_colors[df_spec_clust$cluster]
          icons <- awesomeIcons(
            icon = 'ios-close',
            iconColor = 'black',
            library = 'ion',
            markerColor =  clust_colors)
          m2<-leaflet(df_spec_clust) %>% addTiles() %>%
            addAwesomeMarkers(lat=~Latitude, lng = ~Longitude, icon=icons, label=~cluster) 
          plot2<-m2} else plot2 <- NULL
      
      
        for(i in 1:nrow(df_spec_clust)){
          df_line <- rbind(df_spec_prop[,c("Latitude","Longitude")],
                           df_spec_clust[i,c("Latitude","Longitude")])
          m2 <- m1 %>%
            addPolylines(data = df_line, 
                         lat=~Latitude, 
                         lng = ~Longitude,
                         color="red")
        }
        plot2<-m2
      
      
        return(list(
          "Plot1" = plot1,
          "Plot2" = plot2,
          "Data" = data_table
        ))
      }
      
      ui <- bootstrapPage(
        navbarPage(theme = shinytheme("flatly"), collapsible = TRUE,
                   "Cl", 
                   tabPanel("Solution",
                            sidebarLayout(
                              sidebarPanel(
                                tags$b(h3("Choose the cluster number?")),
                                sliderInput("Slider", h5(""),
                                            min = 2, max = 5, value = 3),
                              ),
                              mainPanel(
                                tabsetPanel(      
                                  tabPanel("Solution", (leafletOutput("Leaf1",width = "95%", height = "600")))))
      
                            ))),
        tabPanel("",
                 sidebarLayout(
                   sidebarPanel(
                     selectInput("Filter1", label = h4("Select just one cluster to show"),""),
                     selectInput("Filter2",label=h4("Select the cluster property designated above"),""),
                   ),
                   mainPanel(
                     tabsetPanel(
                       tabPanel("Map", (leafletOutput("Leaf2",width = "95%", height = "600")))))
                 )))
      
      server <- function(input, output, session) {
      
        Modelcl<-reactive({
          function.cl(df,input$Slider,input$Filter1,input$Filter2)
        })
      
        output$Leaf1 <- renderLeaflet({
          Modelcl()[[1]]
        })
      
        output$Leaf2 <- renderLeaflet({
          Modelcl()[[2]]
        })
      
        observeEvent(input$Slider, {
          abc <- req(Modelcl()$Data)
          updateSelectInput(session,'Filter1',
                            choices=sort(unique(abc$cluster)))
        }) 
      
        observeEvent(input$Filter1,{
          abc <- req(Modelcl()$Data) %>% filter(cluster == as.numeric(input$Filter1))
          updateSelectInput(session,'Filter2',
                            choices=sort(unique(abc$Properties)))
        }) 
      
      
      }
      
      shinyApp(ui = ui, server = server)
      

      【讨论】:

      • 感谢朋友的回答。但是您的代码,地图上的第二个显示与第一个地图相同的图像,但这不是我想要的。第二个是指特定的集群。我调整了问题和代码以便更好地理解。
      • @JovaniSouza 这就是你想要的吗? stackoverflow.com/questions/61648479/… 在那里查看我的解决方案。
      猜你喜欢
      • 2011-10-17
      • 2016-08-17
      • 2016-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-22
      • 2021-12-23
      相关资源
      最近更新 更多