题
我在 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 )
}
我不喜欢必须在函数范围之外声明变量 count 。在 C 或 C++ 中,我可以创建一个静态变量。我可以用 R 编程语言做类似的事情吗?
解决方案
这里有一种方法,通过使用一个封闭件(在编程语言的意义上),即计数变量存储在仅通过您的功能访问的一个封闭环境:
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)
其他提示
这是另一种方法。这个需要更少的打字并且(在我看来)更具可读性:
f <- function(x) {
y <- attr(f, "sum")
if (is.null(y)) {
y <- 0
}
y <- x + y
attr(f, "sum") <<- y
return(y)
}
这个片段以及这个概念的更复杂的例子可以通过找到 在这篇 R-Bloggers 文章中
不隶属于 StackOverflow