Pregunta

Tengo una función en R que llamo varias veces. Quiero hacer un seguimiento del número de veces que he llamado y usarlo para tomar decisiones sobre qué hacer en el interior de la función. Aquí es lo que tengo en este momento:

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 ++ tan sólo pudiera hacer una variable estática. ¿Puedo hacer una cosa similar en el lenguaje de programación R?

¿Fue útil?

Solución

He aquí una manera 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)

Otros consejos

Este 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 puede ser encontrado en este R-Bloggers artículo

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top