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

Duncan Murdoch murdoch at stats.uwo.ca
Thu Feb 2 23:15:53 CET 2006


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
>>




More information about the R-help mailing list