[R-pkg-devel] Problem with package containing spatial data

Duncan Murdoch murdoch@dunc@n @end|ng |rom gm@||@com
Thu Feb 9 21:21:11 CET 2023


On 09/02/2023 12:41 p.m., Alexandre Courtiol wrote:
> Hi Igor,
> 
> I had the same issue using terra rather than sf a couple of weeks ago.
> 
> I thought of solving the issue as follow:
> 
>  1.
> 
>     store the shapefiles under extdata.
> 
>  2.
> 
>     create a function that loads the files:
> 
> .build_internal_files  <-  function() {
>    ## This function should not be called by the user.
>    ## It performs the lazy loading of the data since terra cannot handle 
> rda files
>    assign("CountryBorders",terra::vect(system.file("extdata/CountryBorders.shp",package  =  "IsoriX")),envir  =  as.environment("package:IsoriX"))
>    assign("OceanMask",terra::vect(system.file("extdata/OceanMask.shp",package  =  "IsoriX")),envir  =  as.environment("package:IsoriX"))
> }
> 
>  3. call that function automatically upon attach using |.onAttach()|:
> 
> .onAttach  <-  function(libname,pkgname) {
>      .build_internal_files()## lazy loading of the internal data
> }
> 
> It seems to work...
> 
> Note that .onAttach() is a standard way of defining a function that is 
> recognised by R and ran when the package is attached.

Would these files ever be used when your package is not attached, e.g. 
through a function imported by a different package?  If so, you should 
use .onLoad(), not .onAttach().

Duncan Murdoch

> 
> ++
> 
> Alex
> 
> 
> On Thu, 9 Feb 2023 at 11:11, Duncan Murdoch <murdoch.duncan using gmail.com 
> <mailto:murdoch.duncan using gmail.com>> wrote:
> 
>     On 09/02/2023 3:56 a.m., Ivan Krylov wrote:
>      > В Wed, 8 Feb 2023 11:32:36 -0300
>      > Igor L <igorlaltuf using gmail.com <mailto:igorlaltuf using gmail.com>> пишет:
>      >
>      >> spatial_aisp <- sf::st_read('data-raw/shp_aisp/lm_aisp_2019.shp')
>      >>
>      >> plot(spatial_aisp) # works
>      >>
>      >> # Same data from .rda file after use usethis::use_data(spatial_aisp,
>      >> overwrite = TRUE)
>      >>
>      >> x <- ispdata::spatial_aisp
>      >>
>      >> plot(x) # do not work
>      >
>      > Does this break in a new R session, but start working when you
>     load the
>      > sf namespace? I think that your package needs to depend on sf in
>     order
>      > for this to work. Specifying it in Imports may be enough to make the
>      > plot.sf S3 method available to the user.
> 
>     Specifying a package in the Imports field of DESCRIPTION guarantees
>     that
>     it will be available to load, but doesn't load it.  Importing something
>     from it via the NAMESPACE triggers a load, as does executing code like
>     pkg::fn, or explicitly calling loadNamespace("pkg"), or loading a
>     package that does one of these things.
> 
> 
>      > You may encounter other problems if you go this way, like R CMD check
>      > complaining that you don't use the package you're importing. Loading
>      > the data from a file on demand would also load the sf namespace and
>      > thus solve the problem.
> 
>     Workarounds for the check complaints are discussed here, among other
>     places: https://stackoverflow.com/a/75384338/2554330
>     <https://stackoverflow.com/a/75384338/2554330> .
> 
>     Duncan Murdoch
> 
>     ______________________________________________
>     R-package-devel using r-project.org <mailto:R-package-devel using r-project.org>
>     mailing list
>     https://stat.ethz.ch/mailman/listinfo/r-package-devel
>     <https://stat.ethz.ch/mailman/listinfo/r-package-devel>
> 
> 
> 
> -- 
> Alexandre Courtiol, www.datazoogang.de <http://www.datazoogang.de>



More information about the R-package-devel mailing list