[R-pkg-devel] conditional import of a package?

Duncan Murdoch murdoch@dunc@n @end|ng |rom gm@||@com
Wed Dec 4 20:56:52 CET 2024


On 2024-12-04 1:25 p.m., Adelchi Azzalini wrote:
> Hi. I am working on the development of an existing package (smof, on CRAN). My current aim is widen the list of possible optimizers from which the user can select one method for optimizing a certain task. Well-known possibilities within the base package are optim (with various options) and nlminb. Besides these, I am thinking of including also those of package nloptr, but without forcing users to install this package which perhaps they don't need for other purposes. Hence, I would like to import nloptr only if it is available on the user system; it not, I can just confine the list of optimizers to optim and nlminb.
> 
> This idea implies a sort of “conditional import” of nloptr. Is this possible? Section 1.1.3.1 "Suggested packages" of
> https://translation.r-project.org/man/R-exts/R-exts-ko.html#Suggested-packages
> seems to hint at such a possibility.  See the use of requireNamespace in the second paragraph.
> 
> After elaborating along this line, I packaged my code, with nloptr listed on the line Suggests of DESCRIPTION.  However this attempt failed a the “R CMD check “ stage with message
> 
> Namespace dependency missing from DESCRIPTION Imports/Depends entries: ‘nloptr’
> 
> In addition, I have no idea of how to declare a "conditional import” in NAMESPACE.
> 
> Is this idea of “conditional import” totally unfeasible, then?

The usual way to do this is to list the package in Suggests, and then 
wrap any use of it in `if (requireNamespace("pkg")) { ... }` blocks. 
This doesn't quite import the functions, you would need to use the 
`pkg::fn` syntax to access the functions.

If you really want to simulate importing so that you don't need the 
`pkg::` prefix, you could do it this way:  In the `.onLoad` function of 
your package, you would have code like

   if (requireNamespace("pkg")) {
     foo <- pkg::foo
     bar <- pkg::bar
   } else {
     foo <- stub
     bar <- stub
   }

where `stub` is a function that says "you need `pkg` to use this function".

Duncan Murdoch



More information about the R-package-devel mailing list