Question

I ai une fonction de R que j'appelle plusieurs fois. Je veux garder une trace du nombre de fois que je l'ai appelé et l'utiliser pour prendre des décisions sur ce qu'il faut faire à l'intérieur de la fonction. Voici ce que j'ai en ce moment:

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 )
}

Je n'aime pas que je dois déclarer le nombre variable en dehors du champ d'application de la fonction. En C ou C ++ je pouvais faire une variable statique. Puis-je faire quelque chose de semblable dans le langage de programmation R?

Était-ce utile?

La solution

Voici un moyen à l'aide d'une fermeture (dans le sens du langage de programmation), à savoir stocker la variable de comptage dans un environnement englobante accessible uniquement par votre fonction:

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)

Autres conseils

Voici une autre approche. Celui-ci nécessite moins de frappe et (à mon avis) plus lisible:

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

Cet extrait, ainsi que par exemple plus complexe du concept peut par trouver dans cet article R-Bloggers

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top