Message-ID: <f681abff-7084-8f60-688d-02f2e83b2622@gmail.com>
Date: 2023-02-09T20:21:11Z
From: Duncan Murdoch
Subject: [R-pkg-devel] Problem with package containing spatial data
In-Reply-To: <CAERMt4dWH4MXTH1ge7j+LaKos2P0WyUdTqViptVdadGOwattgg@mail.gmail.com>
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 at gmail.com
> <mailto:murdoch.duncan at 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 at gmail.com <mailto:igorlaltuf at 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 at r-project.org <mailto:R-package-devel at 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>