代码之家  ›  专栏  ›  技术社区  ›  James Thompson

R中的静态变量

  •  18
  • James Thompson  · 技术社区  · 15 年前

    我在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编程语言做类似的事情吗?

    2 回复  |  直到 10 年前
        1
  •  26
  •   ars    15 年前

    以下是一种使用闭包(在编程语言意义上)的方法,即将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)
    
        2
  •  5
  •   Boris Gorelik    12 年前

    这是另一种方法。这一个需要较少的打字和(在我看来)更易读:

    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