Skip to content
Prev 377166 / 398502 Next

Question about function scope

Thanks Duncan for your quick reply.

Ideally, I would want bar1 and bar2 to be independent functions, because they are huge in actuality and, as the actual foo function grows, I may end up with 10 different bar# functions. So I would like to separate them from foo as much as possible.


----- Original Message -----
From: "Duncan Murdoch" <murdoch.duncan at gmail.com>
To: "Sebastien Bihorel" <sebastien.bihorel at cognigencorp.com>, r-help at r-project.org
Sent: Tuesday, October 30, 2018 4:13:05 PM
Subject: Re: [R] Question about function scope
On 30/10/2018 3:56 PM, Sebastien Bihorel wrote:
I haven't looked up that quote, but it is likely describing a situation 
that isn't relevant to you.  For you, the important part is that bar1 
and bar2 must be created within foo.  They don't need to be returned 
from it.

So my edit below of your code should do what you want.

foo <- function(a=1, b=2, c=0){

   bar1 <- function(){
     x <<- 1
     y <<- 1
     z <<- 1
     cat(sprintf('bar1: x=%d, y=%d, z=%d\n', x, y, z))
   }

   bar2 <- function(){
     x <<- 2
     y <<- 2
     z <<- 2
     cat(sprintf('bar2: x=%d, y=%d, z=%d\n', x, y, z))
   }

   # some setup code
   dummy <- a + b
   x <- y <- z <- 0

   # here is my scope problem
   if (c==1) bar1()
   if (c==2) bar2()

   # some more code
   cat(sprintf('foo: x=%d, y=%d, z=%d\n', x, y, z))

}

foo(c=0)
foo(c=1)
foo(c=2)

I get this output:

 > foo(c=0)
foo: x=0, y=0, z=0
 > foo(c=1)
bar1: x=1, y=1, z=1
foo: x=1, y=1, z=1
 > foo(c=2)
bar2: x=2, y=2, z=2
foo: x=2, y=2, z=2

Duncan Murdoch