img - Variables estáticas en R
tags$style shiny (2)
Tengo una función en R a la que llamo varias veces. Quiero hacer un seguimiento de la cantidad de veces que lo he llamado y usarlo para tomar decisiones sobre qué hacer dentro de la función. Esto es lo que tengo ahora:
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 tenga que declarar el recuento de variables fuera del alcance 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?
Aquí hay otro enfoque. Este requiere menos escritura 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 de código, así como un ejemplo más complejo del concepto, se pueden encontrar en este artículo de R-Bloggers.
Aquí hay una forma de usar un cierre (en el sentido del lenguaje de programación), es decir, almacenar la variable de recuento en un entorno cerrado accesible solo 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)