Bill, Duncan, Thanks for the replies.
On Wed, Dec 6, 2017 at 12:51 PM, Duncan Murdoch <murdoch.dun...@gmail.com> wrote: > On 06/12/2017 8:44 AM, Bill Denney wrote: >> >> >>> On Dec 6, 2017, at 07:45, Joshua Ulrich <josh.m.ulr...@gmail.com> wrote: >>> >>> To avoid excessive dependencies, I would like to only register >>> foo.bar() if package A is installed at the time package B is >>> installed. If package A is installed after package B, then warn the >>> user when package B is loaded and/or attached, so they can re-install >>> A and have foo.bar() registered correctly. >> >> >> One simple solution would be to wrap the instantiation of foo.bar in a >> require test: >> >> if (require(A)) { >> foo.bar <- function(...) { >> print("To be or not to be") >> } >> } else { >> message("To use the foo.bar function, please install package A.") >> } >> > > It's usually better to use requireNamespace("A") instead of require("A") > (and the quotes are needed in requireNamespace(), but optional in > require()). That tries to load the package, but doesn't mess with the search > list. > > But that'll likely cause warnings, unless the same condition is used in the > NAMESPACE file where there should be an entry > > S3method(foo, bar) > > The thing is, I'm not sure if > > if (requireNamespace("A")) > S3method(foo, bar) > > is legal in a NAMESPACE file. > While perhaps not technically illegal, that doesn't work because you need if (requireNamespace("A", quietly = TRUE)) { importFrom(A, foo) S3method(foo, bar) } to prevent an error about being able to find object 'foo' when loading B's namespace. But the importFrom() causes R CMD check to expect a hard dependency on package A (and all its dependencies), which is what I'm trying to avoid... > Duncan Murdoch -- Joshua Ulrich | about.me/joshuaulrich FOSS Trading | www.fosstrading.com R/Finance 2018 | www.rinfinance.com ______________________________________________ R-package-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-package-devel