19

我在 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 )
}

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

4

3 回答 3

30

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

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)
于 2009-07-06T19:25:31.260 回答
5

这是另一种方法。这个需要更少的打字并且(在我看来)更具可读性:

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

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

于 2013-01-14T17:02:26.407 回答
1

G. Grothendieck 那里似乎给出了正确的答案:Emulating static variable within R functions但不知何故,这篇文章在谷歌搜索中获得了更有利的位置,所以我在这里复制这个答案:

在本地定义 f ,如下所示:

f <- local({ 
  static <- 0
  function() { static <<- static + 1; static }
})
f()
## [1] 1
f()
## [1] 2
于 2021-07-07T15:02:41.813 回答