2009-07-06 220 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