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)