R中的静态变量

Jam*_*son 18 closures r static-variables

我在R中有一个我多次调用的函数.我想跟踪我调用它的次数,并使用它来决定在函数内部做什么.这就是我现在所拥有的:

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 )
}
Run Code Online (Sandbox Code Playgroud)

我不喜欢我必须在函数范围之外声明变量count.在C或C++中,我可以创建一个静态变量.我可以用R编程语言做类似的事情吗?

ars*_*ars 27

这是使用闭包的一种方式(在编程语言意义上),即将count变量存储在只能由您的函数访问的封闭环境中:

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)
Run Code Online (Sandbox Code Playgroud)


Bor*_*lik 5

这是另一种方法.这个需要更少的打字和(在我看来)更可读:

f <- function(x) {
    y <- attr(f, "sum")
    if (is.null(y)) {
        y <- 0
    }
    y <- x + y
    attr(f, "sum") <<- y
    return(y)
}
Run Code Online (Sandbox Code Playgroud)

这个片段,以及更复杂的概念示例可以在本R-Bloggers文章中找到

  • 这种方法的缺点是,每次运行它时,实际上都是在创建f的副本. (7认同)