[R] Controlling visibility of top-level functions

Rolf Turner r.turner at auckland.ac.nz
Fri Jan 31 23:09:36 CET 2014


On 01/02/14 08:13, Duncan Murdoch wrote:
> On 31/01/2014 1:46 PM, Paul A. Steckler wrote:
>> I'm fairly new to R, and have checked the R FAQ and done an
>> RSiteSearch for help
>> on this topic, to no avail.
>>
>> I want to write some R code that has functions at the top-level that
>> are not visible when
>> the code is loaded. So in
>>
>>    fun1 <- function(...)  { ... }
>>
>>    fun2 <- function(...)  { ... fun1 ...}
>>
>> I'd like fun2 to be callable, but have fun1 be invisible. That is, the
>> scope of fun1 is
>> limited to the file in which it's defined.
>>
>> In Python, I believe that prepending an underscore to a variable name
>> limits its scope in this way.
>> Is there a similar mechanism in R?
>
> There are a couple ways.
>
> The heavyweight way is to write a package that exports fun2 but not
> fun1.  fun2 can see fun1, but the rest of the world can't.
> Scope isn't limited to one file, any function in the package can see it.
>
> The lightweight way is to define fun1 and fun2 in a local scope, e.g.
>
> fun3 <- local({
>
>    fun1 <- function(...)  { ... }
>
>    fun2 <- function(...)  { ... fun1 ...}
>    fun2
> })
>
> This way fun1 and fun2 can see each other but nobody else can see them,
> and fun3 is a copy of fun2 that is visible in the workspace.  You don't
> need a third name, I just changed it to make the explanation easier.

Would it not be more perspicuous to do:

fun2 <- local({

     fun1 <- function(...)  { ... }

     function(...)  { ... fun1 ...}
})

Having fun3 kicking around seems to be an effect brought to you by the 
Department of Redundancy Department.

cheers,

Rolf




More information about the R-help mailing list