2009-07-06 17 views
18

Ich habe eine Funktion in R, die ich mehrmals aufrufen. Ich möchte die Anzahl der Male, die ich es genannt habe, im Auge behalten und damit entscheiden, was ich innerhalb der Funktion tun soll. Hier ist, was ich jetzt haben:Statische Variablen 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) 
} 

Ich mag es nicht, dass ich die variable Zählung außerhalb des Bereichs der Funktion zu erklären haben. In C oder C++ konnte ich einfach eine statische Variable erstellen. Kann ich in der R-Programmiersprache Ähnliches machen?

Antwort

25

Hier ist eine Art und Weise durch einen Verschluss mit (im Sinne Programmiersprache), das heißt speichert die Zählvariable in einer einschließenden Umgebung zugänglich nur durch Ihre Funktion:

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

perfekte Antwort finden kann, das ist genau das, was ich suchte zum. :) –

4

Hier ist ein anderer Ansatz. Dieses erfordert weniger tippen und (meiner Meinung nach) besser lesbar:

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

Dieser Code-Schnipsel sowie komplexere Beispiel für das Konzept von in this R-Bloggers article

+6

Der Nachteil dieses Ansatzes ist, dass Sie tatsächlich eine Kopie von f jedes Mal erstellen, wenn Sie es ausführen. – hadley

+0

Können Sie bitte erklären warum? @Hadley – hshihab