[R-pkg-devel] active bindings in package namespace
Kirill Müller
kr|m|r+m| @end|ng |rom m@||box@org
Sat Mar 23 23:14:53 CET 2019
Dear Jack
This doesn't answer your question, but I would advise against this design.
- Users do not expect side effects (such as network access) from
accessing a symbol.
- A function gives you much more flexibility to change the interface
later on. (Arguments for fetching the data, tokens for API access, ...)
- You already encountered a few quirks that make this an "interesting"
problem.
A function call only needs a pair of parentheses.
Best regards
Kirill
On 23.03.19 16:50, Jack O. Wasey wrote:
> Dear all,
>
> I am developing a package which is a front for various online data
> (icd.data https://github.com/jackwasey/icd.data/ ). The current CRAN
> version just has lazy-loaded data, but now the package encompasses far
> more current and historic ICD codes from different countries, these
> can't be included in the CRAN package even with maximal compression.
>
> Other authors have solved this using functions to get the data, with
> or without a local cache of the retrieved data. No CRAN or other
> packages I have found after extensive searching use the attractive
> active binding feature of R.
>
> The goal is simple: for the user to refer to the data by its symbol,
> e.g., 'icd10fr2019', or 'icd.data::icd10fr2019', and it will be
> downloaded and parsed transparently (if the user has already granted
> permission, or after prompt if they haven't).
>
> The bindings are set using commands alongside the function definitions
> in R/*.R .E.g.
>
> makeActiveBinding("icd10cm_latest", .icd10cm_latest_binding,
> environment())
> lockBinding("icd10cm_latest", environment())
>
> For non-interactive use, CI and CRAN tests, no data should be
> downloaded, and no cache directory set up without user consent. For
> interactive use, I ask permission to create a local data cache before
> downloading data.
>
> This works fine... until R CMD check. The following steps seems to
> 'get' or 'source' everything from the package namespace, which results
> in triggering the active bindings, and this fails if I am unable to
> get consent to download data, and want to 'stop' on this error condition.
> - checking dependencies in R code
> - checking S3 generic/method consistency
> - checking foreign function calls
> - checking R code for possible problems
>
> Debugging CI-specific binding bugs is a nightmare because these occur
> in different R sessions initiated by R CMD check.
>
> There may be legitimate reasons to evaluate everything in the
> namespace, but I've no idea what they are. Incidentally, Rstudio also
> does 'mget' on the whole package namespace and triggers bindings
> during autocomplete. https://github.com/rstudio/rstudio/issues/4414
>
> Is this something I should raise as an issue with R? Or does anyone
> have any idea of a sensible approach to this. Currently I have a set
> of workarounds, but this complicates the code, and has taken an awful
> lot of time. Does anyone know of any CRAN package which has active
> bindings in the package namespace?
>
> Any ideas appreciated.
>
> Jack Wasey
>
> ______________________________________________
> R-package-devel using r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-package-devel
More information about the R-package-devel
mailing list