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

(プログラミング言語の意味で) クロージャを使用する 1 つの方法を次に示します。つまり、count 変数を、関数によってのみアクセス可能な囲み環境に格納します。

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 に答える