2017-10-03 2 views
3

Ordnung stackies,Funktion Betreiber und Umgebungen

Ich habe Advanced R Lesen und haben wirklich fand es hilfreich. Ich bin an einem Punkt, wo ich nicht wirklich verstehen, R Verhalten im Beispiel:

dot_every <- function(n, f) { 
    i <- 1 
    function(...) { 
    if (i %% n == 0) cat(".") 
    i <<- i + 1 
    f(...) 
    } 
} 

So, hier ist die Idee, dass wir jede n-te Iteration der Funktion einer Zeit anzuzeigen. Was ich nicht verstehe ist, wie der Wert von i durch mehrere Aufrufe von dot_every in einem funktionalen verwaltet wird. Ich verstehe, dass <<- bewegt durch Umgebungen nach etwas mit dem Namen i und ersetzt dann mit i+1. Ich würde das in etwa so gedacht habe:

x <- lapply(1:20, dot_every(10, runif))

würde Müll sammeln, dass i für jede Iteration in lapply und somit nie erhöhen. Meine Intuition ist, dass es so funktionieren würde:

for(i in 1:20){ 
    dot_every(10, runif)(i) 
} 

Welche dot_every zu sein scheint zu rufen, Müll zu sammeln i und damit nichts angezeigt wird. Was ist anders in diesem Fall, wenn das Funktionale als die For-Schleife verwendet wird?

Danke für Ihre Hilfe!

Antwort

3

Im ersten Fall (mit der lapply) rufen Sie dot_every() nur einmal, und dann die resultierende Funktion für jedes Element in 1:20. Im zweiten Fall rufen Sie in jedem Durchgang durch die Schleife dot_every() auf und verwenden dann die resultierende Funktion nur einmal. Um dies zu sehen, legen Sie die Zeile:

cat("!") 

als die erste Zeile in der Definition von dot_every(). Dann:

> x <- lapply(1:20, dot_every(10, runif)) 
!.. 

aber

> for(i in 1:20) dot_every(10,runif)(i) 
!!!!!!!!!!!!!!!!!!!! 
+0

Ahhh ... das meist sinnvoll. Also wird die Umgebung, die 'dot_every' erstellt, nicht geschlossen, bis' lapply' ausgeführt wird? Das würde für mich einen Sinn ergeben, wie jeder Aufruf "i" beeinflussen kann. – svenhalvorson

+0

Jeder Aufruf von 'dot_every()' erzeugt einen neuen Abschluss, der solange existiert, bis die von 'dot_every()' erzeugte Funktion den Gültigkeitsbereich verlässt. –

+0

Ausgezeichnet, vielen Dank! – svenhalvorson