[Rd] Correct use of Depends, Imports and ::

Stephanie M. Gogarten sdmorris at u.washington.edu
Wed Nov 7 22:25:13 CET 2012



On 11/7/12 12:00 PM, Prof Brian Ripley wrote:
> On 07/11/2012 17:52, mauricio zambrano wrote:
>>
>>
>> On 11/07/12, Simon Urbanek  <simon.urbanek at r-project.org> wrote:
>>
>>> On Nov 7, 2012, at 9:25 AM, Simon Urbanek wrote:
>>>
>>>> On Nov 7, 2012, at 4:04 AM, Mauricio Zambrano-Bigiarini wrote:
>>>>
>>>>> Dear R developers,
>>>>>
>>>>> Taking advantage of the yesterday discussion about the use of
>>>>> Depends/Import/Suggests/Enhances, I would like to add a related
>>>>> question.
>>>>>
>>>>> Let's assume, in the DESCRIPTION file of my package foo0, I
>>>>> have:
>>>>>
>>>>> Depends: foo1 Imports: foo2
>>>>>
>>>>> while in the NAMESPACE file of my package I have
>>>>>
>>>>> importFrom("foo2", f2)
>>>>>
>>>>>
>>>>> and within my package I use the following two external
>>>>> functions:
>>>>>
>>>>> f1, from package foo1 f2, from package foo2
>>>>>
>>>>>
>>>>> If I want to use the two previous functions within a function
>>>>> of my package foo0, is it correct to call them as follow (
>>>>> assuming 'x' is the only argument of 'f1' and 'f2'):
>>>>>
>>>>> f1(x) foo2::f2(x)
>>>>>
>>>>> OR should I use
>>>>>
>>>>> foo1::f1(x) f2(x)
>>>>>
>>>>> OR
>>>>>
>>>>> f1(x) f2(x)
>>>>>
>>>>
>>>> Yes, this one. You have imported f2 so the whole point of that is
>>>> that it will be inserted as "f2" into your imports environment,
>>>> so you want to use it that way. When you use foo2:: you are
>>>> skipping over imports and addressing the namespace of foo2
>>>> directly which sort of defeats the purpose (and is slower).
>>
>> Thanks Simon for making the point related to f2 clearer for me.
>>
>>>>
>>>> As for f1, you have attached the package so it is available. I
>>>> would not use foo1:: for the same reason as above, but there is a
>>>> risk that it may get clobbered since the call will go through the
>>>> search path so you may not get f1 from foo1 necessarily - this
>>>> may or may not be a good thing depending on your intentions. You
>>>> could import it via import(foo1) to make sure you don't need to
>>>> go through the search path - that's what I would do if I don't
>>>> intend overrides. (Whether you want to use Depends or Imports in
>>>> that case is related to what you intend for the user to see as I
>>>> was saying in my last comment - if I expect users to use foo1 as
>>>> well, I would use Depends, otherwise Imports is good enough.)
>
> Or declare in Depends but also import in the NAMESPACE.

This is especially a good idea if there is any chance that anyone else 
will ever want to import your package.  If a package is in Depends but 
the functions you use are not explicitly imported in the NAMESPACE (with 
imports or importsFrom), it can cause problems as described in this thread:

https://stat.ethz.ch/pipermail/r-devel/2011-September/062043.html


>
>> So, if I'm only using a few functions of foo1, I shouldn't declare
>> them in Depends, but only in Imports, which also will allow me to be
>> sure that the functions come from foo1 and not from another package
>> that have functions with the same, right ?
>
> Yes, but it would be better to use importsFrom() with just the functions
> you need (the list of exported functions from foo1 could change over time).
>
> I've just been through this advising an author of a package who needs to
> use intersect() from rgeos, not intersect() from base.
>
>

Stephanie Gogarten
Research Scientist, Biostatistics
University of Washington



More information about the R-devel mailing list