Skip to content
Back to formatted view

Raw Message

Message-ID: <CAPPM_gQbR_gWZLuU76vkPm_p4+s5jCkoX4+0sN55ywiFbPNXzw@mail.gmail.com>
Date: 2017-12-07T12:22:59Z
From: Joshua Ulrich
Subject: [R-pkg-devel] Conditionally register method with generic in other package
In-Reply-To: <2476de02-2acf-b413-058f-9dd6981ff4a4@gmail.com>

Bill, Duncan,

Thanks for the replies.

On Wed, Dec 6, 2017 at 12:51 PM, Duncan Murdoch
<murdoch.duncan at gmail.com> wrote:
> On 06/12/2017 8:44 AM, Bill Denney wrote:
>>
>>
>>> On Dec 6, 2017, at 07:45, Joshua Ulrich <josh.m.ulrich at 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