2 votes

Comment expand.grid et rep fonctionnent-ils ensemble pour montrer toutes les combinaisons de résultats ?

J'utilise rep et expand.grid avec lists mais le résultat n'est pas celui que j'attendais. La documentation n'est pas claire sur la façon dont expand.grid travaille avec lists . Quelqu'un pourrait-il expliquer comment ces deux fonctions fonctionnent ensemble ?

rep réplique les éléments d'un vecteur x

x <- c(0, 1)
rep(x, 2)
# 0 1 0 1

pour qu'il réplique les éléments du vecteur/de la liste.

Cependant, quand je l'exécute comme ceci :

rep(list(x),2)
#[[1]]
#[1] 0 1
#
#[[2]]
#[1] 0 1

Pourquoi y a-t-il deux éléments répétés dans deux entrées différentes de la liste ? Je m'attendais à ce que cela donne un list avec 1 élément contenant 0 1 0 1 .

De même, l'utilisation de expand.grid sur le vecteur 0 1 0 1 donne :

expand.grid(c(0, 1, 0, 1))
#  Var 1
#1     0
#2     1
#3     0
#4     1

Cependant, l'utilisation de expand.grid sur la liste ci-dessus donne :

expand.grid(rep(list(x), 2))
#  Var1 Var2
#1    0    0
#2    1    0
#3    0    1
#4    1    1

Comment cela fonctionne-t-il ?

2voto

Laterow Points 1630

Question 1 : Pourquoi rep(list(x),2) donner une liste avec 2 éléments ?

La meilleure façon d'envisager une liste (pour l'instant) est de dire qu'il s'agit d'un vecteur dont les éléments peuvent être n'importe quoi. Lorsque vous exécutez list(x) vous créez une liste dont le premier élément est lui-même un vecteur, à savoir 0 1 . Lorsque vous saisissez une liste à rep il répliquera simplement les éléments de la liste comme il le ferait pour un vecteur. Ainsi :

rep(list(x), 2)

Reproduit les éléments de list(x) . Puisqu'il s'agit d'une liste de longueur 1, cela donnera une liste de longueur 2. Gardez à l'esprit que dans ce processus, je n'ai jamais parlé du CONTENU des éléments. Si vous voulez les reproduire, vous devez d'abord les extraire de la liste :

rep(list(x)[[1]], 2)
# [1] 0 1 0 1

Question 2 : Alors pourquoi expand.grid(rep(list(x), 2)) ne pas sortir également une liste ?

C'est parce que expand.grid a été écrit pour fonctionner de deux façons :

  1. Fournir chaque vecteur/facteur comme un argument séparé
  2. Mettez tous les vecteurs/facteurs dans une liste et fournissez-la comme seul argument.

Puisque vous fournissez une liste, expand.grid examinera ensuite le CONTENU de chaque élément et appliquera les règles suivantes expand.grid à travers les éléments. En fait, vous appelez :

expand.grid(c(0,1), c(0,1))

Et en effet, dès que nous fournissons DEUX arguments, il renvoie un comportement plus attendu (c'est-à-dire toutes les combinaisons de tous les éléments des deux listes) :

expand.grid(list(x, x + 1), list(x + 2, x + 3))
#  Var1 Var2
#1 0, 1 2, 3
#2 1, 2 2, 3
#3 0, 1 3, 4
#4 1, 2 3, 4

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X