2017-01-28 16 views
0

Ich möchte eine Liste von Funktionen in R erstellen, wo Werte aus einer for-Schleife in der Funktionsdefinition gespeichert werden. Hier ein Beispiel:R: For-Loop-Variable in Funktionsdeklaration verwenden

init <- function(){ 
    mod <- list() 
    for(i in 1:3){ 
    mod[[length(mod) + 1]] <- function(x) sum(i + x) 
    } 
    return(mod) 
} 

mod <- init() 

mod[[1]](2) # 5 - but I want 3 
mod[[2]](2) # 5 - but I want 4 

Im obigen Beispiel, unabhängig davon, welche Funktion ich nenne, ist i immer der letzte Wert in der for-Schleife-Sequenz, ich verstehe dies das richtige Verhalten ist.

Ich bin auf der Suche nach etwas, das dies erreicht:

mod[[1]] <- function(x) sum(1 + x) 
mod[[2]] <- function(x) sum(2 + x) 
mod[[3]] <- function(x) sum(3 + x) 
+0

Warum? Scheint verschlungen. Es klingt so, als ob man vor der Schleife eine andere Variable wie 'const <- 2' deklarieren und stattdessen 'sum (const + x)' verwenden möchte. Immer noch wirklich verwirrt ... – adatum

+0

Ich habe ein Beispiel hinzugefügt, wie ich jede Funktion aussehen möchte. Mein tatsächlicher Anwendungsfall ist komplizierter. Ich versuche nur zu verstehen, wie der Bereich funktioniert. – BMW

Antwort

2

Sie explizit sicherstellen können i ausgewertet wird es durch die Verwendung force in der for-Schleife aktuellen Wert.

init <- function(){ 
    mod <- list() 
    f_gen = function(i) { 
    force(i) 
    return(function(x) sum(i + x)) 
    } 
    for(i in 1:3){ 
    mod[[i]] <- f_gen(i) 
    } 
    return(mod) 
} 

mod <- init() 

mod[[1]](2) 
# [1] 3 
mod[[2]](2) 
# [1] 4 

Weitere Details sind in der Functions/Lazy Evaluation subsection of Advanced R. Siehe auch ?force, natürlich. Ihr Beispiel ist ziemlich ähnlich den Beispielen in ?force gegeben.

Die Verwendung einer Einzelfunktionsgeneratorfunktion (in meinem obigen Code) scheint mehr Sinn zu ergeben als eine Liste von Funktionen Generatorfunktion. Mit meinem f_gen Ihren Code Code vereinfacht werden:

f_gen = function(i) { 
     force(i) 
     return(function(x) sum(i + x)) 
} 
mod2 <- lapply(1:3, f_gen) 

mod2[[1]](2) 
# [1] 3 
mod2[[2]](2) 
# [1] 4 

## or alternately 
mod3 = list() 
for (i in 1:3) mod3[[i]] <- f_gen(i) 
mod3[[1]](2) 
mod3[[2]](2) 
Verwandte Themen