Domanda

Ho una funzione in R che io chiamo più volte. Voglio tenere traccia del numero di volte che l'ho chiamata e l'uso che a prendere decisioni su cosa fare all'interno della funzione. Ecco quello che ho in questo momento:

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 ++ ho potuto solo fare una variabile statica. Posso fare una cosa simile nel linguaggio di programmazione R?

È stato utile?

Soluzione

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)

Altri suggerimenti

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, nonché esempio più complesso del concetto possono da trovati in questo R-Bloggers articolo

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top