[R] How to get the namespace of a function?

Luke Tierney luke at stat.uiowa.edu
Fri Feb 3 14:09:20 CET 2006


On Thu, 2 Feb 2006, Duncan Murdoch wrote:

> On 2/2/2006 5:56 PM, Berton Gunter wrote:
>> Just echoing and slightly amplifying Gabor's comment...
>>
>> The semantics of R are really based on functional programming (LISP-like)
>> rather than OOP (JAVA-like)? R's behavior is "proper" from that point of
>> view; what is "improper" is Fernando's expectation that it should behave
>> some other way.
>
> I don't think it's that so much as trying not to break old code.  It
> doesn't make sense to me that the search order within a namespace should
> pass through the global environment, but something would break if it
> didn't.  (I suspect it's probably the old S3 object system, which
> predates namespaces by a long time, but it's been a while since I've
> thought about this.)

S3 dispatch was the primary reason for this design.  At some point we
may be able to revisit this but probably not very soon.

Once code analysis becomes a standard part of R, either via byte code
compilation or as bart of R CMD check, there should be warnings issued
automatically for this sort of thing.  For now manually using the
codetools ackage Brian pointed to is one option.

Best,

luke

>
> Duncan Murdoch
>
>
> > Of course, one can simulate anything with a Turing machine,
>> but I consider Fernando's criticisms somewhat "unfair" because he is
>> expecting R to behave like something he is familiar with rather than as it
>> was designed to. For this reason, what bothers him seems wholly desirable to
>> me -- I want there to be well-defined scoping convention (lexical scoping)
>> for R to find free variables.
>>
>> Cheers,
>>
>> Bert
>>
>>
>>
>> -----Original Message-----
>> From: r-help-bounces at stat.math.ethz.ch
>> [mailto:r-help-bounces at stat.math.ethz.ch] On Behalf Of Duncan Murdoch
>> Sent: Thursday, February 02, 2006 2:16 PM
>> To: fsaldanha at alum.mit.edu
>> Cc: r-help at stat.math.ethz.ch
>> Subject: Re: [R] How to get the namespace of a function?
>>
>> On 2/2/2006 5:05 PM, Fernando Saldanha wrote:
>>> I am trying to imitate "encapsulation" from other languages like Java
>>> or C++. Coming from that background, it bothers me that I can commit
>>> errors like the following:
>>>
>>>> x <- 1
>>>> f <- function(z) { y <- x; y + 1 } # Mistake: I should have written y <-
>> z
>>>> f(10)
>>> [1] 2
>>>
>>> In a language like Java the interpreter would have noticed that x was
>>> an undeclared variable and an error message would be issued. R, on the
>>> other hand, allows the code to run, as x exists in the global
>>> environment. I was trying to avoid such situations by  setting the
>>> environment of f to be NULL. If there is a better way to catch this
>>> type of errors I would be interested in knowing about it.
>>
>> Put your code in a package, and use a namespace.  This isn't perfect,
>> but it gives you more control than you have when running scripts at the
>> console.
>>
>> There's an article by Luke Tierney in one of R News 3/1 that explains
>> the search order when namespaces are involved.
>>
>> Duncan Murdoch
>>> FS
>>>
>>> On 2/2/06, Duncan Murdoch <murdoch at stats.uwo.ca> wrote:
>>>> On 2/2/2006 10:56 AM, Fernando Saldanha wrote:
>>>>> I declared the environment of the function myfun to be NULL as follows:
>>>>>
>>>>> environment(myfun) <- NULL
>>>> Since version 2.1.0, it's been recommended that you use
>>>>
>>>> environment(myfun) <- baseenv()
>>>>
>>>> and since 2.2.0, you'll get a warning when using NULL (and you'll get an
>>>> error in 2.3.0).  But why would you want to do that?  What are you
>>>> trying to achieve?
>>>>
>>>> Duncan Murdoch
>>>>
>>>>
>>>>> Later on I called that myfun and got an error message because the
>>>>> function index() in the zoo package was called inside myfun and was
>>>>> not visible:
>>>>>
>>>>> Error in myfun(args) : couldn't find function "index"
>>>>>
>>>>> I tried to use zoo::index() instead of index(), but that did not work.
>>>>> In fact, zoo::index does not work even in the command line:
>>>>>
>>>>>> z<-ts(1:5)
>>>>>> z
>>>>> Time Series:
>>>>> Start = 1
>>>>> End = 5
>>>>> Frequency = 1
>>>>> [1] 1 2 3 4 5
>>>>>> index(z)
>>>>> [1] 1 2 3 4 5
>>>>>> zoo::index(z)
>>>>> Error in loadNamespace(name) : package 'zoo' does not have a name space
>>>>>
>>>>> How can I qualify index() so that it is visible inside the body of
>> myfun?
>>>>> Thanks for any suggestions,
>>>>>
>>>>> FS
>>>>>
>>>>> ______________________________________________
>>>>> R-help at stat.math.ethz.ch mailing list
>>>>> https://stat.ethz.ch/mailman/listinfo/r-help
>>>>> PLEASE do read the posting guide!
>> http://www.R-project.org/posting-guide.html
>>
>> ______________________________________________
>> R-help at stat.math.ethz.ch mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide!
>> http://www.R-project.org/posting-guide.html
>>
>> ______________________________________________
>> R-help at stat.math.ethz.ch mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
>
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
>

-- 
Luke Tierney
Chair, Statistics and Actuarial Science
Ralph E. Wareham Professor of Mathematical Sciences
University of Iowa                  Phone:             319-335-3386
Department of Statistics and        Fax:               319-335-3017
    Actuarial Science
241 Schaeffer Hall                  email:      luke at stat.uiowa.edu
Iowa City, IA 52242                 WWW:  http://www.stat.uiowa.edu




More information about the R-help mailing list