2011-10-14 2 views
2

Je n'arrive pas à trouver comment utiliser do.call pour appeler et exécuter une liste de fonctions.Utilisation de do.call pour appeler une liste de fonctions

par exemple:

make.draw = function(i){i;function()runif(i)} 
function.list = list() 
for (i in 1:3) function.list[[i]] = make.draw(i) 

déboucheront sur

> function.list[[1]]() 
[1] 0.2996515 
> function.list[[2]]() 
[1] 0.7276203 0.4704813 
> function.list[[3]]() 
[1] 0.9092999 0.7307774 0.4647443 

ce que je veux faire est de créer une fonction qui appelle les trois fonctions de la liste d'un seul coup. à partir de ce que je comprends as.call() peut être utilisé pour le faire, mais j'ai du mal à relier les points et obtenir 6 tirages aléatoires uniformes de function.list.

+2

Je suppose que votre utilisation réelle pour ce qui exclut tout simplement faire 'runif (6)'? – joran

+0

Oui, je suis en train de faire une très longue liste de fonctions personnalisées en utilisant une procédure d'usine comme ci-dessus. Je trouve runif utile pour l'exemple parce que la sortie et l'entrée sont facilement observables. – honeyoak

Répondre

11

Vouliez-vous quelque chose comme ça?

lapply(function.list, do.call, list()) 
# [[1]] 
# [1] 0.5777857 

# [[2]] 
# [1] 0.8970102 0.5892031 

# [[3]] 
# [1] 0.4712016 0.2624851 0.2353192 
+0

J'espérais quelque chose qui utilise des primitives, c'est-à-dire sans utiliser de boucles explicites – honeyoak

+0

D'où viennent vos fonctions? La meilleure solution est de s'assurer qu'ils sont correctement vectorisés. Si ce n'est pas possible, une boucle 'for' explicite, avec un tableau de résultats pré-alloué devrait être assez rapide --- la plupart du temps sera passé à l'intérieur des fonctions dans' function.list'. – pete

+4

Il n'y a pas de primitive pour cela. Et la lapply seulement boucle au niveau c de toute façon. – hadley

4
make.draw = function(i){runif(i)} 
Map(make.draw, 1:3) 
#[[1]] 
#[1] 0.03442084 

#[[2]] 
#[1] 0.6899443 0.8896434 

#[[3]] 
#[1] 0.3899678 0.2845898 0.4920698 
+0

carte est juste un emballage pour sapply qui a le même pour les problèmes de boucle. J'essaie d'appeler 40 fonctions différentes 10 000 fois pour une simulation mc et je préfère l'écrire en r si j'ai l'option. – honeyoak

+1

Je soupçonne que les retards d'efficacité se situent dans ces «40 fonctions différentes» dans une mesure beaucoup plus grande que toute «question de boucle». –

+0

vous avez probablement raison, mais je voudrais savoir comment le faire de toute façon pour référence future. il serait bon de savoir comment exécuter de gros lots de code de manière séquentielle sans aucune boucle supplémentaire et je suis certain que vous pouvez le faire avec la procédure .call. – honeyoak

Questions connexes