2017-10-12 7 views
2

Je voudrais vectoriser la création d'une liste dans R, mais je ne peux obtenir que ce que je veux avec une boucle for imbriquée. J'ai inclus une version très simplifiée de mon problème pour la reproductibilité. Quelqu'un peut-il m'aider à modifier ou remplacer ma fonction mapply?Comment répliquer une boucle for imbriquée avec mapply?

fonctionnalité souhaitée:

[[1]] [1] "one left" 
[[2]] [1] "one right" 
[[3]] [1] "two left" 
[[4]] [1] "two right" 
[[5]] [1] "three left" 
[[6]] [1] "three right" 
[[7]] [1] "four left" 
[[8]] [1] "four right" 

Ma tentative de vectoriser ceci::

my_list <- list() 
A <- c("one", "two", "three", "four") 
B <- c("left", "right") 
for (a in A) { 
    for (b in B) { 
     my_list <- c(my_list, paste(a, b)) 
    } 
} 
print(my_list) 

sortie (espace blanc édité par souci de concision)

combinate <- function(a, b) { 
    return(paste(a, b)) 
} 
mapply(combinate, a=A, b=B, SIMPLIFY=FALSE) 

sortie:

$one [1] "one left" 
$two [1] "two right" 
$three [1] "three left" 
$four [1] "four right" 

Je ne suis pas préoccupé par les étiquettes; Je suis préoccupé par l'obtention de tous les huit résultats de la boucle sur les deux listes. J'ai trouvé la documentation que mapply fait exactement ce qu'il est censé faire en appariant les premiers éléments des deux listes, puis les deuxièmes éléments des deux listes, etc. en répétant des listes plus courtes. Mais après beaucoup de recherches, je ne peux pas trouver ce qui doit être là, un moyen de coupler tous les éléments de la liste de manière combinatoire comme la boucle for imbriquée.

Répondre

3

Nous pouvons le faire avec expand.grid et paste

v1 <- do.call(paste, expand.grid(A, B)) 

Ou avec outer

v1 <- c(outer(A, B, paste)) 

Si ces besoins d'être dans un list

as.list(v1) 

Vérification avec la sortie OP

identical(as.list(c(t(outer(A, B, paste)))), my_list) 
#[1] TRUE 
+0

J'apprends la dure, ils ne fonctionnent pas lorsque ceux-ci font exactement ce que j'avais demandé à la question tout à fait la même que celle pour -boucle. La fonction de collage n'est pas appelée 8 fois, chacune avec des variables différentes, mais en passant deux listes ou des tableaux de 8 éléments. La fonction externe s'attend à ce que la fonction de collage (ou toute autre fonction personnalisée que vous fournissez) puisse gérer cela correctement. Ou corrigez-moi si je me méprends encore. :) – mightypile

+0

@mightypile Dans l'argument 'outer', l'argument' FUN' est 'paste'. Ce que 'outer' fait est d'obtenir la combinaison des éléments de chaque vecteur et en spécifiant' paste' comme 'FUN', il fait le collage – akrun