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

Mauricio Zambrano-Bigiarini hzambran.newsgroups at gmail.com
Thu Nov 8 00:30:06 CET 2012


2012/11/7 Stephanie M. Gogarten <sdmorris at u.washington.edu>:
>
>
> 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, no matter if the package providing the functions I'm using within
my package (e.g., foo1) are declared in the Depends or Imports section
of the DESCRIPTION file, it is always a "good practice" to specify all
the imported functions with import(foo1) or importFrom("foo1",
f11,...,f1n) in the NAMESPACE file of my package, in order to avoid
problems as the one described in the previous link.

Thanks Prof. Ripley and Stephanie for the advice,

All the best,

Mauricio
--
=====================================
Water Resources Unit
Institute for Environment and Sustainability
Joint Research Centre, European Commission
webinfo    : http://floods.jrc.ec.europa.eu/
=====================================
DISCLAIMER:\ "The views expressed are purely those of th...{{dropped:11}}



More information about the R-devel mailing list