2009-07-06 11 views
18

J'ai une fonction dans 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:Variables statiques dans R

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 pourrais juste faire une variable statique. Puis-je faire une chose similaire dans le langage de programmation R?

Répondre

25

est ici 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) 
+0

réponse parfaite, c'est exactement ce que je recherchais pour. :) –

4

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 trouvé in this R-Bloggers article

+6

L'inconvénient de cette approche est que vous créez réellement une copie de f chaque fois que vous l'exécutez. – hadley

+0

Pouvez-vous expliquer pourquoi? @hadley – hshihab