Thanks, Duncan, for the kind advice. 

In my understanding, this is what I have done (or I tried to do).  My code is 
as follows:

  opt.methods <- c("Nelder-Mead", "BFGS", "nlminb")
  if(requireNamespace("nloptr", quietly = TRUE)) {
    nloptr.methods <- c("newuoa", "bobyqa", "cobyla")
    if(opt.method %in%  nloptr.methods) require(nloptr, quietly=TRUE)
    opt.methods <- c(opt.methods, nloptr.methods)
   }

<skip>

   if(opt.method %in% nloptr.methods) {    
      pos <- match("package:nloptr", search())
      nloptr.method <-  get(paste("nloptr", opt.method, sep="::"), pos=pos)
      opt <- nloptr.method(<args>)
      }
       
In the DESCRIPTION file there is
   Suggests: ggplot2, survival, nloptr

However, when I run “R CMD check <etc>”, I get the following message 
* checking package dependencies ... ERROR
Namespace dependency missing from DESCRIPTION Imports/Depends entries: ‘nloptr’

See section ‘The DESCRIPTION file’ in the ‘Writing R Extensions’
manual.
* DONE

And - admittedly - I have no idea about how to insert appropriate import 
statements in NAMESPACE.


Best regards,

Adelchi


> On 4 Dec 2024, at 20:56, Duncan Murdoch <murdoch.dun...@gmail.com> wrote:
> 
> 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
> 

______________________________________________
R-package-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-package-devel

Reply via email to