2009-07-06 10 views
18

私はRで複数回呼び出す関数を持っています。私はそれを呼び出した回数を把握し、それを使って関数の中で何をすべきかを決定したいと思います。ここで私が今持っているものです:私は、関数のスコープ外変数countを宣言していることを好きではないスタティック変数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) 
} 

。私は静的変数を作ることができます。 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

完璧な答えを見つけることができ、これは私が探していたまさにです:この1は少ないタイピングと(私の意見では)より読みやすいが必要ですために。 :) –

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

+0

理由を説明していただけますか? @ハドレー – hshihab

関連する問題