1

I have written a loop over a shiny module which displays a marker on a leaflet map. However on all of my maps the same marker is shown (I want to show each pair of coordinates in the data.frame on a different map). I do not know why but the data subsetting seems to fail. Can anyone explain why this happens and how to solve this?

library(shiny)
library(leaflet)

Data <- data.frame(longitude = c(11, 12, 14), latitude = c(50, 49, 51))

mod_map_ui <- function(.id) {
  ns <- shiny::NS(.id)
  leafletOutput(ns("map"))
}

mod_map <- function(input, output, session, .Data) {
  output$map <- renderLeaflet({
    leaflet() %>% 
      addTiles() %>%
      addMarkers(data = .Data)
  })
}


ui <- fluidPage(
  uiOutput("list")
)

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

  observe({
    tag.list <- tagList()
      for (i in seq_len(NROW(Data))) {
        tag.list <- tagAppendChildren(
          tag.list,
          mod_map_ui(paste0("map_mod", i)), br()
        )
        callModule(mod_map, paste0("map_mod", i), .Data = Data[i, ])
    }

    output$list <- renderUI({
      tag.list
    })
  })
}

shinyApp(ui, server)
needRhelp
  • 2,948
  • 2
  • 24
  • 48

1 Answers1

0

Not 100% sure why, but if you take your callModule command and bring it out of the observe section and use lapply instead a for loop it appears to work.

library(shiny)
library(leaflet)

Data <- data.frame(longitude = c(11, 12, 14), latitude = c(50, 49, 51))

mod_map_ui <- function(.id) {
  ns <- shiny::NS(.id)
  leafletOutput(ns("map"))
}

mod_map <- function(input, output, session, .Data) {
  output$map <- renderLeaflet({
    leaflet() %>% 
      addTiles() %>%
      addMarkers(data = .Data)
  })
}


ui <- fluidPage(
  uiOutput("list")
)

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

  observe({
    tag.list <- tagList()
    for (i in seq_len(NROW(Data))) {
      tag.list <- tagAppendChildren(
        tag.list,
        mod_map_ui(paste0("map_mod", i)), br()
      )
    }

    output$list <- renderUI({
      tag.list
    })
  })

#####
  lapply(seq_len(NROW(Data)), function(i){
    callModule(mod_map, paste0("map_mod", i), .Data = Data[i, ])
  })
#####

}

shinyApp(ui, server)
rfineman
  • 128
  • 2
  • 9