Search code examples
rclosuresstatic-variables

Static Variables in R


I have a function in R that I call multiple times. I want to keep track of the number of times that I've called it and use that to make decisions on what to do inside of the function. Here's what I have right now:

f = function( x ) {
   count <<- count + 1
   return( mean(x) )
}

count = 1
numbers = rnorm( n = 100, mean = 0, sd = 1 )
for ( x in seq(1,100) ) {
   mean = f( numbers )
   print( count )
}

I don't like that I have to declare the variable count outside the scope of the function. In C or C++ I could just make a static variable. Can I do a similar thing in the R programming language?


Solution

  • Here's one way by using a closure (in the programming language sense), i.e. store the count variable in an enclosing environment accessible only by your function:

    make.f <- function() {
        count <- 0
        f <- function(x) {
            count <<- count + 1
            return( list(mean=mean(x), count=count) )
        }
        return( f )
    }
    
    f1 <- make.f()
    result <- f1(1:10)
    print(result$count, result$mean)
    result <- f1(1:10)
    print(result$count, result$mean)
    
    f2 <- make.f()
    result <- f2(1:10)
    print(result$count, result$mean)
    result <- f2(1:10)
    print(result$count, result$mean)