[Rd] New S3 methods for optional package
Jon Olav Skoien
jon.skoien at jrc.ec.europa.eu
Thu May 24 15:00:48 CEST 2012
Dear Prof. Ripley,
Thanks a lot for your answers!
See inline comments below.
On 24-May-12 12:01, Prof Brian Ripley wrote:
> On 24/05/2012 10:38, Jon Olav Skoien wrote:
>> I have listed A
>> under Suggests, and have a .onLoad function in B with
>> if (require(A)) registerS3methods(newMethodsMatrix, package = A, env =
>> environment(B))
>
> You are not supposed to be calling registerS3methods .... it is only
> visible because of the nature of the base namespace and its
> documentation says
>
> 'Not intended to be called directly.'
>
> And require() is the wrong thing here; you want to register methods on
> a namespace. The logic seems to be that you should do that only if
> A's namespace is already loaded, but you could load it pre-emptively
> with requireNamespace().
Replacing require with requireNamespace does not seem to work for this
case, it fails with the error:
Error: object 'estimateParameters' not found whilst loading namespace
'intamap'
This comes from registerS3methods which cannot find the generic
estimateParameters from parent.env of B (rtop). Is this because
loadNamespace does not attach the namespace to the search path?
>
>
>> List A under Enhances of B.
>> This seems to be the right thing, as the R extensions manual says: "the
>> 'Enhances' field lists packages "enhanced" by the package at hand, e.g.,
>> by providing methods for classes from these packages".
>> However, although it seems I can install and load package B when I
>> conditionally import package A in the NAMESPACE, R CMD check stops with
>> the error: Namespace dependency not required: A
>> If I remove the import, R CMD check is happier, but I cannot load the
>> package after installing.
>>
>> I have read about the use of "Suggest", "Enhances" etc in "Writing R
>> Extensions", but could not figure out the right way to do this. I am
>> sure there is something I am missing here.
>>
>> If anyone wants to check possible solutions, package A is "intamap",
>> available from CRAN, whereas B is "rtop", available from Rforge:
>> **|install.packages("rtop", repos="http://R-Forge.R-project.org")|**
>
> I guess the problem is that you are trying to do too much with package
> rtop. I would consider creating a separate package depending on
> intamap (and most likely rtop) which adds the S3 methods for intamap.
I really hoped that would not be necessary, but you are probably right
that it is the only solution if I want to get rid of the note. The
disadvantage is then that I have to clutter the package repository of
CRAN with one more package, which only purpose is to load two other
packages. For me that does not appear as a better solution than having a
package with a note and use of a function that is not intended. But then
I am also not sure how much extra work my current solution would give
the CRAN-maintainers, so if you think an extra package is better I will
follow your advice.
Thanks,
Jon
--
Jon Olav Skøien
Joint Research Centre - European Commission
Institute for Environment and Sustainability (IES)
Land Resource Management Unit
Via Fermi 2749, TP 440, I-21027 Ispra (VA), ITALY
jon.skoien at jrc.ec.europa.eu
Tel: +39 0332 789206
Disclaimer: Views expressed in this email are those of the individual and do not necessarily represent official views of the European Commission.
More information about the R-devel
mailing list