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 <[email protected]> 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
>
______________________________________________
[email protected] mailing list
https://stat.ethz.ch/mailman/listinfo/r-package-devel