Variáveis ??estáticos em R
-
23-08-2019 - |
Pergunta
Eu tenho uma função em R que eu chamo várias vezes. Eu quero manter o controle do número de vezes que eu chamei ele e usar isso para tomar decisões sobre o que fazer dentro da função. Aqui está o que eu tenho agora:
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 )
}
Eu não gosto que eu tenho que declarar a contagem variável fora do escopo da função. Em C ou C ++ eu poderia apenas fazer uma variável estática. Posso fazer uma coisa semelhante na linguagem de programação R?
Solução
Aqui está uma maneira usando um fecho (no sentido linguagem de programação), ou seja, armazenar a variável de contagem em um ambiente envolvente acessível apenas por sua função:
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)
Outras dicas
Aqui é uma outra abordagem. Este exige menos digitação e (na minha opinião) mais legível:
f <- function(x) {
y <- attr(f, "sum")
if (is.null(y)) {
y <- 0
}
y <- x + y
attr(f, "sum") <<- y
return(y)
}
Este trecho, bem como mais complexo exemplo da lata conceito por encontrados neste artigo R-Bloggers