Skip to content
Prev 377164 / 398502 Next

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