2009-07-06 15 views
18

Ho una funzione in R che chiamo più volte. Voglio tenere traccia del numero di volte che l'ho chiamato e usarlo per prendere decisioni su cosa fare all'interno della funzione. Ecco quello che ho in questo momento:Variabili statiche in 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) 
} 

non mi piace che devo dichiarare il numero di variabili al di fuori del campo di applicazione della funzione. In C o C++ potrei semplicemente creare una variabile statica. Posso fare una cosa simile nel linguaggio di programmazione R?

risposta

25

Ecco un modo utilizzando una chiusura (nel senso linguaggio di programmazione), vale a dire conservare la variabile di conteggio in un ambiente che racchiude accessibile solo con la funzione:

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

risposta perfetta, questo è esattamente quello che stavo cercando per. :) –

4

Ecco un altro approccio. Questo richiede meno di battitura e (a mio parere) più leggibile:

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

Questo frammento di codice, così come esempio più complesso del concetto può da trovato in this R-Bloggers article

+6

Lo svantaggio di questo approccio è che in effetti stai creando una copia di f ogni volta che la esegui. – hadley

+0

Puoi spiegare perché? @hadley – hshihab