Error when plotting a {sf} object
Opened this issue · 0 comments
dicorynia commented
Hi
Not sure if it comes from {furrr}, {sf} or another package in between, ({future}, {vctrs} ?). Let me know if I should report elsewhere...
When plotting each row of a spatial layer ({sf} polygon object) with {ggplot2} or base plot, it works with walk
but I get some errors using future_walk
.
This code used to work with previous versions of the packages, but I can't give precisely the version number of the different packages, or exactly when (a few month ago ?)...
Reproducible example
library(dplyr)
#>
#> Attachement du package : 'dplyr'
#> Les objets suivants sont masqués depuis 'package:stats':
#>
#> filter, lag
#> Les objets suivants sont masqués depuis 'package:base':
#>
#> intersect, setdiff, setequal, union
library(ggplot2)
library(purrr)
library(furrr)
#> Le chargement a nécessité le package : future
library(sf)
#> Linking to GEOS 3.11.2, GDAL 3.6.2, PROJ 9.2.0; sf_use_s2() is TRUE
plan(multisession, workers = 2)
# create a {sf} layer with 2 polygons
layer <- data.frame(id = 1:2) %>%
mutate(geom = c("POINT(0 0)", "POINT(0 1)")) %>%
st_as_sf(wkt = "geom") %>%
st_buffer(0.5)
with ggplot: work with walk
but not future_walk
# ggplot and save a map of the layer d for id == i
my_plot <- function(i, d) {
d %>%
filter(id == i) %>%
ggplot() +
geom_sf()
ggsave(paste0("plot_", i, ".png"))
}
layer %>%
pull(id) %>%
walk(my_plot, d = layer)
#> Saving 7 x 5 in image
#> Saving 7 x 5 in image
layer %>%
pull(id) %>%
future_walk(my_plot, d = layer)
#> Error:
#> ℹ In index: 1.
#> Caused by error in `vec_size()`:
#> ! `x` must be a vector, not a <sfc_POLYGON/sfc> object.
#> Backtrace:
#> ▆
#> 1. ├─parallel (local) workRSOCK()
#> 2. │ └─parallel:::workLoop(...)
#> 3. │ └─parallel:::workCommand(master)
#> 4. │ ├─base::tryCatch(...)
#> 5. │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
#> 6. │ │ └─base (local) tryCatchOne(expr, names, parentenv, handlers[[1L]])
#> 7. │ │ └─base (local) doTryCatch(return(expr), name, parentenv, handler)
#> 8. │ ├─base::tryCatch(...)
#> 9. │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
#> 10. │ │ └─base (local) tryCatchOne(expr, names, parentenv, handlers[[1L]])
#> 11. │ │ └─base (local) doTryCatch(return(expr), name, parentenv, handler)
#> 12. │ ├─base::do.call(msg$data$fun, msg$data$args, quote = TRUE)
#> 13. │ └─future (local) `<fn>`(...)
#> 14. │ └─base::eval(expr, envir = envir, enclos = enclos)
#> 15. │ └─base::eval(expr, envir = envir, enclos = enclos)
#> 16. ├─base::tryCatch(...)
#> 17. │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
#> 18. │ └─base (local) tryCatchOne(expr, names, parentenv, handlers[[1L]])
#> 19. │ └─base (local) doTryCatch(return(expr), name, parentenv, handler)
#> 20. ├─base::withCallingHandlers(...)
#> 21. ├─base::withVisible(...)
#> 22. ├─base::local(...)
#> 23. │ └─base::eval.parent(substitute(eval(quote(expr), envir)))
#> 24. │ └─base::eval(expr, p)
#> 25. │ └─base::eval(expr, p)
#> 26. ├─base::eval(...)
#> 27. │ └─base::eval(...)
#> 28. │ ├─base::withCallingHandlers(...)
#> 29. │ ├─base::do.call(...furrr_map_fn, args)
#> 30. │ └─purrr (local) `<fn>`(.x = 1L, .f = `<fn>`, d = `<sf[,2]>`)
#> 31. │ └─purrr:::map_("list", .x, .f, ..., .progress = .progress)
#> 32. │ ├─purrr:::with_indexed_errors(...)
#> 33. │ │ └─base::withCallingHandlers(...)
#> 34. │ ├─purrr:::call_with_cleanup(...)
#> 35. │ └─.f(.x[[i]], ...)
#> 36. │ └─global ...furrr_fn(...)
#> 37. │ └─d %>% filter(id == i) %>% ggplot()
#> 38. ├─ggplot2::ggplot(.)
#> 39. ├─dplyr::filter(., id == i)
#> 40. ├─dplyr:::filter.data.frame(., id == i)
#> 41. │ ├─dplyr::dplyr_row_slice(.data, loc, preserve = .preserve)
#> 42. │ └─dplyr:::dplyr_row_slice.data.frame(.data, loc, preserve = .preserve)
#> 43. │ ├─dplyr::dplyr_reconstruct(vec_slice(data, i), data)
#> 44. │ │ └─dplyr:::dplyr_new_data_frame(data)
#> 45. │ │ ├─row.names %||% .row_names_info(x, type = 0L)
#> 46. │ │ └─base::.row_names_info(x, type = 0L)
#> 47. │ └─vctrs::vec_slice(data, i)
#> 48. └─vctrs:::stop_scalar_type(`<fn>`(`<s_POLYGO>`), "x", `<fn>`(vec_size()))
#> 49. └─vctrs:::stop_vctrs(...)
#> 50. └─rlang::abort(message, class = c(class, "vctrs_error"), ..., call = call)
with base plot: work with walk
but not future_walk
# plot and save a map of the layer d for id == i
my_plot_base <- function(i, d) {
plot(d[d$id == i, ], main = i)
}
layer %>%
pull(id) %>%
walk(my_plot_base, d = layer)
layer %>%
pull(id) %>%
future_walk(my_plot_base, d = layer)
#> Warning in min(x): aucun argument trouvé pour min ; Inf est renvoyé
#> Warning in max(x): aucun argument pour max ; -Inf est renvoyé
#> Error:
#> ℹ In index: 1.
#> Caused by error in `plot.window()`:
#> ! valeurs finies requises pour 'ylim'
#> Backtrace:
#> ▆
#> 1. ├─parallel (local) workRSOCK()
#> 2. │ └─parallel:::workLoop(...)
#> 3. │ └─parallel:::workCommand(master)
#> 4. │ ├─base::tryCatch(...)
#> 5. │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
#> 6. │ │ └─base (local) tryCatchOne(expr, names, parentenv, handlers[[1L]])
#> 7. │ │ └─base (local) doTryCatch(return(expr), name, parentenv, handler)
#> 8. │ ├─base::tryCatch(...)
#> 9. │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
#> 10. │ │ └─base (local) tryCatchOne(expr, names, parentenv, handlers[[1L]])
#> 11. │ │ └─base (local) doTryCatch(return(expr), name, parentenv, handler)
#> 12. │ ├─base::do.call(msg$data$fun, msg$data$args, quote = TRUE)
#> 13. │ └─future (local) `<fn>`(...)
#> 14. │ └─base::eval(expr, envir = envir, enclos = enclos)
#> 15. │ └─base::eval(expr, envir = envir, enclos = enclos)
#> 16. ├─base::tryCatch(...)
#> 17. │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
#> 18. │ └─base (local) tryCatchOne(expr, names, parentenv, handlers[[1L]])
#> 19. │ └─base (local) doTryCatch(return(expr), name, parentenv, handler)
#> 20. ├─base::withCallingHandlers(...)
#> 21. ├─base::withVisible(...)
#> 22. ├─base::local(...)
#> 23. │ └─base::eval.parent(substitute(eval(quote(expr), envir)))
#> 24. │ └─base::eval(expr, p)
#> 25. │ └─base::eval(expr, p)
#> 26. ├─base::eval(...)
#> 27. │ └─base::eval(...)
#> 28. │ ├─base::withCallingHandlers(...)
#> 29. │ ├─base::do.call(...furrr_map_fn, args)
#> 30. │ └─purrr (local) `<fn>`(.x = 1L, .f = `<fn>`, d = `<sf[,2]>`)
#> 31. │ └─purrr:::map_("list", .x, .f, ..., .progress = .progress)
#> 32. │ ├─purrr:::with_indexed_errors(...)
#> 33. │ │ └─base::withCallingHandlers(...)
#> 34. │ ├─purrr:::call_with_cleanup(...)
#> 35. │ └─.f(.x[[i]], ...)
#> 36. │ └─global ...furrr_fn(...)
#> 37. │ ├─base::plot(d[d$id == i, ], main = i)
#> 38. │ └─graphics:::plot.data.frame(d[d$id == i, ], main = i)
#> 39. │ └─graphics (local) plot2(x, ...)
#> 40. │ ├─base::plot(x[[1L]], x[[2L]], xlab = xlab, ylab = ylab, ...)
#> 41. │ └─graphics::plot.default(...)
#> 42. │ └─graphics (local) localWindow(xlim, ylim, log, asp, ...)
#> 43. │ └─graphics::plot.window(...)
#> 44. └─base::.handleSimpleError(...)
#> 45. └─purrr (local) h(simpleError(msg, call))
#> 46. └─cli::cli_abort(...)
#> 47. └─rlang::abort(...)
just displaying is fine
display <- function(i, d) {
print(d[d$id == i, ])
}
layer %>%
pull(id) %>%
future_walk(display, d = layer)
#> id
#> 1 1
#> geom
#> 1 5.000000e-01, 4.993148e-01, 4.972609e-01, 4.938442e-01, 4.890738e-01, 4.829629e-01, 4.755283e-01, 4.667902e-01, 4.567727e-01, 4.455033e-01, 4.330127e-01, 4.193353e-01, 4.045085e-01, 3.885730e-01, 3.715724e-01, 3.535534e-01, 3.345653e-01, 3.146602e-01, 2.938926e-01, 2.723195e-01, 2.500000e-01, 2.269952e-01, 2.033683e-01, 1.791840e-01, 1.545085e-01, 1.294095e-01, 1.039558e-01, 7.821723e-02, 5.226423e-02, 2.616798e-02, 3.061516e-17, -2.616798e-02, -5.226423e-02, -7.821723e-02, -1.039558e-01, -1.294095e-01, -1.545085e-01, -1.791840e-01, -2.033683e-01, -2.269952e-01, -2.500000e-01, -2.723195e-01, -2.938926e-01, -3.146602e-01, -3.345653e-01, -3.535534e-01, -3.715724e-01, -3.885730e-01, -4.045085e-01, -4.193353e-01, -4.330127e-01, -4.455033e-01, -4.567727e-01, -4.667902e-01, -4.755283e-01, -4.829629e-01, -4.890738e-01, -4.938442e-01, -4.972609e-01, -4.993148e-01, -5.000000e-01, -4.993148e-01, -4.972609e-01, -4.938442e-01, -4.890738e-01, -4.829629e-01, -4.755283e-01, -4.667902e-01, -4.567727e-01, -4.455033e-01, -4.330127e-01, -4.193353e-01, -4.045085e-01, -3.885730e-01, -3.715724e-01, -3.535534e-01, -3.345653e-01, -3.146602e-01, -2.938926e-01, -2.723195e-01, -2.500000e-01, -2.269952e-01, -2.033683e-01, -1.791840e-01, -1.545085e-01, -1.294095e-01, -1.039558e-01, -7.821723e-02, -5.226423e-02, -2.616798e-02, -9.184548e-17, 2.616798e-02, 5.226423e-02, 7.821723e-02, 1.039558e-01, 1.294095e-01, 1.545085e-01, 1.791840e-01, 2.033683e-01, 2.269952e-01, 2.500000e-01, 2.723195e-01, 2.938926e-01, 3.146602e-01, 3.345653e-01, 3.535534e-01, 3.715724e-01, 3.885730e-01, 4.045085e-01, 4.193353e-01, 4.330127e-01, 4.455033e-01, 4.567727e-01, 4.667902e-01, 4.755283e-01, 4.829629e-01, 4.890738e-01, 4.938442e-01, 4.972609e-01, 4.993148e-01, 5.000000e-01, 0.000000e+00, -2.616798e-02, -5.226423e-02, -7.821723e-02, -1.039558e-01, -1.294095e-01, -1.545085e-01, -1.791840e-01, -2.033683e-01, -2.269952e-01, -2.500000e-01, -2.723195e-01, -2.938926e-01, -3.146602e-01, -3.345653e-01, -3.535534e-01, -3.715724e-01, -3.885730e-01, -4.045085e-01, -4.193353e-01, -4.330127e-01, -4.455033e-01, -4.567727e-01, -4.667902e-01, -4.755283e-01, -4.829629e-01, -4.890738e-01, -4.938442e-01, -4.972609e-01, -4.993148e-01, -5.000000e-01, -4.993148e-01, -4.972609e-01, -4.938442e-01, -4.890738e-01, -4.829629e-01, -4.755283e-01, -4.667902e-01, -4.567727e-01, -4.455033e-01, -4.330127e-01, -4.193353e-01, -4.045085e-01, -3.885730e-01, -3.715724e-01, -3.535534e-01, -3.345653e-01, -3.146602e-01, -2.938926e-01, -2.723195e-01, -2.500000e-01, -2.269952e-01, -2.033683e-01, -1.791840e-01, -1.545085e-01, -1.294095e-01, -1.039558e-01, -7.821723e-02, -5.226423e-02, -2.616798e-02, -6.123032e-17, 2.616798e-02, 5.226423e-02, 7.821723e-02, 1.039558e-01, 1.294095e-01, 1.545085e-01, 1.791840e-01, 2.033683e-01, 2.269952e-01, 2.500000e-01, 2.723195e-01, 2.938926e-01, 3.146602e-01, 3.345653e-01, 3.535534e-01, 3.715724e-01, 3.885730e-01, 4.045085e-01, 4.193353e-01, 4.330127e-01, 4.455033e-01, 4.567727e-01, 4.667902e-01, 4.755283e-01, 4.829629e-01, 4.890738e-01, 4.938442e-01, 4.972609e-01, 4.993148e-01, 5.000000e-01, 4.993148e-01, 4.972609e-01, 4.938442e-01, 4.890738e-01, 4.829629e-01, 4.755283e-01, 4.667902e-01, 4.567727e-01, 4.455033e-01, 4.330127e-01, 4.193353e-01, 4.045085e-01, 3.885730e-01, 3.715724e-01, 3.535534e-01, 3.345653e-01, 3.146602e-01, 2.938926e-01, 2.723195e-01, 2.500000e-01, 2.269952e-01, 2.033683e-01, 1.791840e-01, 1.545085e-01, 1.294095e-01, 1.039558e-01, 7.821723e-02, 5.226423e-02, 2.616798e-02, 0.000000e+00
#> id
#> 2 2
#> geom
#> 2 5.000000e-01, 4.993148e-01, 4.972609e-01, 4.938442e-01, 4.890738e-01, 4.829629e-01, 4.755283e-01, 4.667902e-01, 4.567727e-01, 4.455033e-01, 4.330127e-01, 4.193353e-01, 4.045085e-01, 3.885730e-01, 3.715724e-01, 3.535534e-01, 3.345653e-01, 3.146602e-01, 2.938926e-01, 2.723195e-01, 2.500000e-01, 2.269952e-01, 2.033683e-01, 1.791840e-01, 1.545085e-01, 1.294095e-01, 1.039558e-01, 7.821723e-02, 5.226423e-02, 2.616798e-02, 3.061516e-17, -2.616798e-02, -5.226423e-02, -7.821723e-02, -1.039558e-01, -1.294095e-01, -1.545085e-01, -1.791840e-01, -2.033683e-01, -2.269952e-01, -2.500000e-01, -2.723195e-01, -2.938926e-01, -3.146602e-01, -3.345653e-01, -3.535534e-01, -3.715724e-01, -3.885730e-01, -4.045085e-01, -4.193353e-01, -4.330127e-01, -4.455033e-01, -4.567727e-01, -4.667902e-01, -4.755283e-01, -4.829629e-01, -4.890738e-01, -4.938442e-01, -4.972609e-01, -4.993148e-01, -5.000000e-01, -4.993148e-01, -4.972609e-01, -4.938442e-01, -4.890738e-01, -4.829629e-01, -4.755283e-01, -4.667902e-01, -4.567727e-01, -4.455033e-01, -4.330127e-01, -4.193353e-01, -4.045085e-01, -3.885730e-01, -3.715724e-01, -3.535534e-01, -3.345653e-01, -3.146602e-01, -2.938926e-01, -2.723195e-01, -2.500000e-01, -2.269952e-01, -2.033683e-01, -1.791840e-01, -1.545085e-01, -1.294095e-01, -1.039558e-01, -7.821723e-02, -5.226423e-02, -2.616798e-02, -9.184548e-17, 2.616798e-02, 5.226423e-02, 7.821723e-02, 1.039558e-01, 1.294095e-01, 1.545085e-01, 1.791840e-01, 2.033683e-01, 2.269952e-01, 2.500000e-01, 2.723195e-01, 2.938926e-01, 3.146602e-01, 3.345653e-01, 3.535534e-01, 3.715724e-01, 3.885730e-01, 4.045085e-01, 4.193353e-01, 4.330127e-01, 4.455033e-01, 4.567727e-01, 4.667902e-01, 4.755283e-01, 4.829629e-01, 4.890738e-01, 4.938442e-01, 4.972609e-01, 4.993148e-01, 5.000000e-01, 1.000000e+00, 9.738320e-01, 9.477358e-01, 9.217828e-01, 8.960442e-01, 8.705905e-01, 8.454915e-01, 8.208160e-01, 7.966317e-01, 7.730048e-01, 7.500000e-01, 7.276805e-01, 7.061074e-01, 6.853398e-01, 6.654347e-01, 6.464466e-01, 6.284276e-01, 6.114270e-01, 5.954915e-01, 5.806647e-01, 5.669873e-01, 5.544967e-01, 5.432273e-01, 5.332098e-01, 5.244717e-01, 5.170371e-01, 5.109262e-01, 5.061558e-01, 5.027391e-01, 5.006852e-01, 5.000000e-01, 5.006852e-01, 5.027391e-01, 5.061558e-01, 5.109262e-01, 5.170371e-01, 5.244717e-01, 5.332098e-01, 5.432273e-01, 5.544967e-01, 5.669873e-01, 5.806647e-01, 5.954915e-01, 6.114270e-01, 6.284276e-01, 6.464466e-01, 6.654347e-01, 6.853398e-01, 7.061074e-01, 7.276805e-01, 7.500000e-01, 7.730048e-01, 7.966317e-01, 8.208160e-01, 8.454915e-01, 8.705905e-01, 8.960442e-01, 9.217828e-01, 9.477358e-01, 9.738320e-01, 1.000000e+00, 1.026168e+00, 1.052264e+00, 1.078217e+00, 1.103956e+00, 1.129410e+00, 1.154508e+00, 1.179184e+00, 1.203368e+00, 1.226995e+00, 1.250000e+00, 1.272320e+00, 1.293893e+00, 1.314660e+00, 1.334565e+00, 1.353553e+00, 1.371572e+00, 1.388573e+00, 1.404508e+00, 1.419335e+00, 1.433013e+00, 1.445503e+00, 1.456773e+00, 1.466790e+00, 1.475528e+00, 1.482963e+00, 1.489074e+00, 1.493844e+00, 1.497261e+00, 1.499315e+00, 1.500000e+00, 1.499315e+00, 1.497261e+00, 1.493844e+00, 1.489074e+00, 1.482963e+00, 1.475528e+00, 1.466790e+00, 1.456773e+00, 1.445503e+00, 1.433013e+00, 1.419335e+00, 1.404508e+00, 1.388573e+00, 1.371572e+00, 1.353553e+00, 1.334565e+00, 1.314660e+00, 1.293893e+00, 1.272320e+00, 1.250000e+00, 1.226995e+00, 1.203368e+00, 1.179184e+00, 1.154508e+00, 1.129410e+00, 1.103956e+00, 1.078217e+00, 1.052264e+00, 1.026168e+00, 1.000000e+00
Session info (future and base)
future::futureSessionInfo()
#> *** Package versions
#> future 1.33.0, parallelly 1.36.0, parallel 4.3.1, globals 0.16.2, listenv 0.9.0
#>
#> *** Allocations
#> availableCores():
#> system
#> 12
#> availableWorkers():
#> $system
#> [1] "localhost" "localhost" "localhost" "localhost" "localhost" "localhost"
#> [7] "localhost" "localhost" "localhost" "localhost" "localhost" "localhost"
#>
#> *** Settings
#> - future.plan=<not set>
#> - future.fork.multithreading.enable=<not set>
#> - future.globals.maxSize=<not set>
#> - future.globals.onReference=<not set>
#> - future.resolve.recursive=<not set>
#> - future.rng.onMisuse=<not set>
#> - future.wait.timeout=<not set>
#> - future.wait.interval=<not set>
#> - future.wait.alpha=<not set>
#> - future.startup.script=<not set>
#>
#> *** Backends
#> Number of workers: 2
#> List of future strategies:
#> 1. multisession:
#> - args: function (..., workers = 2, envir = parent.frame())
#> - tweaked: TRUE
#> - call: plan(multisession, workers = 2)
#>
#> *** Basic tests
#> Main R session details:
#> pid r sysname release version nodename machine login user
#> 1 24936 4.3.1 Windows 10 x64 build 19044 host001 x86-64 user001 user001
#> effective_user
#> 1 user001
#> Worker R session details:
#> worker pid r sysname release version nodename machine login
#> 1 1 16300 4.3.1 Windows 10 x64 build 19044 host001 x86-64 user001
#> 2 2 13960 4.3.1 Windows 10 x64 build 19044 host001 x86-64 user001
#> user effective_user
#> 1 user001 user001
#> 2 user001 user001
#> Number of unique worker PIDs: 2 (as expected)
Created on 2023-09-04 with reprex v2.0.2
Session info
sessionInfo()
#> R version 4.3.1 (2023-06-16 ucrt)
#> Platform: x86_64-w64-mingw32/x64 (64-bit)
#> Running under: Windows 10 x64 (build 19044)
#>
#> Matrix products: default
#>
#>
#> locale:
#> [1] LC_COLLATE=French_France.utf8 LC_CTYPE=French_France.utf8
#> [3] LC_MONETARY=French_France.utf8 LC_NUMERIC=C
#> [5] LC_TIME=French_France.utf8
#>
#> time zone: Europe/Paris
#> tzcode source: internal
#>
#> attached base packages:
#> [1] stats graphics grDevices utils datasets methods base
#>
#> other attached packages:
#> [1] sf_1.0-14 furrr_0.3.1 future_1.33.0 purrr_1.0.2 ggplot2_3.4.3
#> [6] dplyr_1.1.2
#>
#> loaded via a namespace (and not attached):
#> [1] utf8_1.2.3 generics_0.1.3 xml2_1.3.5 class_7.3-22
#> [5] KernSmooth_2.23-21 listenv_0.9.0 digest_0.6.33 magrittr_2.0.3
#> [9] evaluate_0.21 grid_4.3.1 fastmap_1.1.1 e1071_1.7-13
#> [13] DBI_1.1.3 fansi_1.0.4 scales_1.2.1 codetools_0.2-19
#> [17] textshaping_0.3.6 cli_3.6.1 rlang_1.1.1 units_0.8-3
#> [21] parallelly_1.36.0 munsell_0.5.0 reprex_2.0.2 withr_2.5.0
#> [25] yaml_2.3.7 tools_4.3.1 parallel_4.3.1 colorspace_2.1-0
#> [29] globals_0.16.2 curl_5.0.2 vctrs_0.6.3 R6_2.5.1
#> [33] proxy_0.4-27 lifecycle_1.0.3 classInt_0.4-9 fs_1.6.3
#> [37] ragg_1.2.5 pkgconfig_2.0.3 pillar_1.9.0 gtable_0.3.4
#> [41] glue_1.6.2 Rcpp_1.0.11 systemfonts_1.0.4 highr_0.10
#> [45] xfun_0.40 tibble_3.2.1 tidyselect_1.2.0 rstudioapi_0.15.0
#> [49] knitr_1.43 farver_2.1.1 htmltools_0.5.6 rmarkdown_2.24
#> [53] compiler_4.3.1