I'm building a function which automates the map plotting for users' data, with various options, one of which is to allow different map backgrounds, either Google satellite from ggmap::get_map, or a global coastline processed by gbm.auto::gbm.basemap (my own package). The problem is, the plot starting function needs to be different, either ggmap or ggplot respectively, but the rest of the plot block is the same. I tried putting this as an option in braces:
if (mapsource == "gbm.basemap") {
ggplot() +
ggspatial::layer_spatial(shape, col = "black")
} else {
ggmap::ggmap(myMap)
} +
stars::geom_stars(data = predabundstars |> sf::st_transform(3857), inherit.aes = FALSE) +
[more code, fill, theme, etc]
This works for the second option (else; ggmap):
But if mapsource == "gbm.basemap", it runs the initial code in braces but nothing after:
If I run the ggplot code outside of braces it works fine, so there's nothing wrong with the data, therefore it must be the 'braces to start a plot' bit:
I tried switching it around (ggmap then basemap), and doing them independently (if ggmap, if basemap) but still no dice. Is this a peculiarity of ggplot? Does anyone know a way around it? I suppose the 'nuclear' option would be duplicating the whole plot code block, one with ggmap, one with ggplot, and ifelse-ing them. I presume that would work but it also kinda sucks that it's that clunky.
Thanks in advance for any intel!
I would recommend assigning to an object within the if statement and then using this after the if statement:
if (mapsource == "gbm.basemap") {
p <- ggplot() +
ggspatial::layer_spatial(shape, col = "black")
} else {
p <- ggmap::ggmap(myMap)
}
p <- p + stars::geom_stars(data = predabundstars |> sf::st_transform(3857), inherit.aes = FALSE)