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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top