2009-07-06 218 views
18

我在R中有一个函数,我多次调用。我想跟踪我调用它的次数,并使用它来决定在函数内部做什么。这里是我现在有: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编程语言中做类似的事情吗?

回答

25

下面是使用闭合(在编程语言的意义上)的一种方式,即计数变量存储在只有你的函数可以访问一个封闭的环境:

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) 
+0

完美答案的更为复杂的例子,这正是我一直在寻找对于。 :) – 2009-07-06 19:55:31

4

这是另一种方法。这其中需要更少的输入和(在我看来)更易于阅读:

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

这个片段,以及概念可以发现in this R-Bloggers article

+6

这种方法的缺点是,你实际上每次运行时都会创建一个f的副本。 – hadley 2013-06-04 13:42:44