Add map caching to regional demo

Change-Id: I450130d35ba1c55a1b1b4327d805d5d3cb9bf4e9
diff --git a/demo/regional.R b/demo/regional.R
index dae7ff5..b079265 100755
--- a/demo/regional.R
+++ b/demo/regional.R
@@ -6,7 +6,29 @@
 
 devAskNewPage(ask = FALSE)
 
-mapfile <- file.path(tempdir(), "map-gadm41-sf-v1.rds")
+# --- CRAN-compliant caching -----------------------------------------------
+# Default to tempdir() during demos/tests. Allow users to opt-in to a
+# persistent cache in a per-user directory via either
+#   options(RKorAPClient.regional.cache = "user")
+# or environment variable
+#   RKORAPCLIENT_CACHE=user
+# Any value among {"user","persistent","cache","true","1","yes"}
+# enables persistent caching. Everything else uses tempdir().
+get_cache_dir <- function() {
+  mode <- tolower(getOption(
+    "RKorAPClient.regional.cache",
+    Sys.getenv("RKORAPCLIENT_CACHE", "temp")
+  ))
+  if (mode %in% c("user", "persistent", "cache", "true", "1", "yes")) {
+    d <- tools::R_user_dir("RKorAPClient", which = "cache")
+  } else {
+    d <- tempdir()
+  }
+  dir.create(d, recursive = TRUE, showWarnings = FALSE)
+  d
+}
+
+mapfile <- file.path(get_cache_dir(), "map-gadm41-sf-v1.rds")
 
 # Caching data in the user's home filespace by default
 # is not allowed to package demos by CRAN policies ...
@@ -35,6 +57,7 @@
 fetchMaps <- function(maps, picks) {
   if (file.exists(mapfile)) {
     df <- readRDS(mapfile)
+  cat("Using cached map from:", mapfile, "\n")
   } else {
   cat("Downloading and caching GADM 4.1 map data.\nPlease note that the GADM map data is licensed for academic use and other non-commercial use, only.\nSee https://gadm.org/license.html\n")
     # Fetch individual sf layers and row-bind
@@ -42,8 +65,8 @@
     df <- do.call(rbind, sflist)
     # Create a stable group index compatible with original regions index logic
     df$grp <- seq_len(nrow(df))
-    dir.create(dirname(mapfile), recursive = TRUE, showWarnings = FALSE)
     saveRDS(df, mapfile)
+  cat("Saved map cache to:", mapfile, "\n")
   }
   # If cache is from an older version (non-sf tidy data), refresh
   if (!inherits(df, "sf")) {
@@ -51,8 +74,8 @@
     sflist <- mapply(fetchAndPrepareMap, maps, picks, SIMPLIFY = FALSE)
     df <- do.call(rbind, sflist)
     df$grp <- seq_len(nrow(df))
-    dir.create(dirname(mapfile), recursive = TRUE, showWarnings = FALSE)
     saveRDS(df, mapfile)
+  cat("Saved map cache to:", mapfile, "\n")
   } else if (is.null(df$grp)) {
     df$grp <- seq_len(nrow(df))
   }