2009-07-06 21 views
18

Tengo una función en R a la que llamo varias veces. Quiero hacer un seguimiento de la cantidad de veces que lo llamé y usarlo para tomar decisiones sobre qué hacer dentro de la función. Aquí es lo que tengo en este momento:Variables estáticas en 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) 
} 

no me gusta que tengo que declarar la variable de conteo fuera del ámbito de la función. En C o C++ podría hacer una variable estática. ¿Puedo hacer algo similar en el lenguaje de programación R?

Respuesta

25

Ésta es una forma mediante el uso de un cierre (en el sentido de lenguaje de programación), es decir, almacenar la variable de recuento en un entorno envolvente accesible sólo por su función:

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

respuesta perfecta, esto es exactamente lo que estaba buscando para. :) –

4

Aquí es otro enfoque. Éste requiere menos escribir y (en mi opinión) más legible:

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

este fragmento, así como ejemplo más complejo del concepto se puede encontrar por in this R-Bloggers article

+6

La desventaja de este enfoque es que en realidad estás creando una copia de f cada vez que lo ejecutas. – hadley

+0

¿Puede explicar por qué? @hadley – hshihab