2010-02-11 7 views
3

Je suis en train de générer itérativement certaines fonctions en utilisant une boucle For:variables évaluation au sein de la boucle R

# Create a list to hold the functions 
funcs <- list() 
funcs[] 

# loop through to define functions 
for(i in 1:21){ 

    # Make function name 
    funcName <- paste('func', i, sep = '') 

    # make function 
    func = function(x){x * i} 

    funcs[[funcName]] = func 

    } 

Cependant, cela ne fonctionne pas comme je l'espérais que la valeur i n'est pas en cours d'évaluation au sein de chaque fonction. Je veux essayer et définir la fonction pour égaler x * 1; x * 2; etc, mais ce que je finis avec est une fonction qui est x * i; où i est 21.

J'ai essayé d'utiliser la fonction eval() et cela a juste eu pour résultat que x * eval (i) était stocké.

Répondre

2

Vérifiez celui-ci:

# Create a list to hold the functions 
funcs <- list() 
funcs[] 

# loop through to define functions 
for(i in 1:21){ 

    # Make function name 
    funcName <- paste('func', i, sep = '') 

    # make function 
    func = paste('function(x){x * ', i,'}',sep = '') 

    funcs[[funcName]] = eval(parse(text=func)) 

    } 
+0

merci - qui a fonctionné! – djq

6

Utilisez une fermeture (fonction qui écrivent des fonctions):

multiply <- function(i) { 
    force(i) 
    function(x) x * i 
} 

funcs <- list() 
for(i in 1:21){ 
    funcName <- paste('func', i, sep = '') 
    funcs[[funcName]] = multiply(i) 
} 

# OR in one line, with lapply 
funcs <- lapply(1:21, multiply) 
+0

Ma compréhension d'une fermeture (au sens général) est que c'est une fonction qui transporte des liaisons à des variables qui étaient dans la portée lexicale de sa définition, au * temps * de sa définition. En R, cela ne semble pas être le cas, sinon l'exemple original de celenius aurait fonctionné. R permet-il en quelque sorte la création de "vraies" fermetures, peut-être en spécifiant explicitement l'environnement ou quelque chose? –

+0

À droite, donc chaque 'i' de chaque fonction était lié au 'i' de l'index de boucle. Ils étaient liés à la variable et non à la valeur. C'est ce que vous obtiendrez dans n'importe quel langage de programmation fonctionnel. –

+0

Le code de Hadley ne fonctionne pas. 'funcs $ func3 (3)' devrait renvoyer 9, mais il renvoie 63, comme toutes les fonctions de 'funcs'. –