3 votes

Vecteur d'éléments n'étant pas mis à jour dans la boucle

Logiquement, ce code devrait avoir du sens, je suis principalement un programmeur Python mais je ne comprends pas pourquoi cela ne fonctionne pas. Aucune erreur n'est renvoyée. Ce que je veux, c'est que ce vecteur principalement composé de zéros soit modifié en un vecteur contenant uniquement des 1 et des -1 (d'où l'utilisation de la fonction sample). Mon problème est que les valeurs du vecteur ne sont pas mises à jour, elles restent simplement à 0 et je ne sais pas pourquoi.

Y = numeric(100)

for (i in 100){
  x <- sample(1:2, 1)
  if (x == 2){
    Y[i] = 1
  }
  else{
    Y[i] = -1
  }
}

J'ai également changé Y[i] = 1 en Y[i] <- 1 mais cela n'a pas aidé. Je sais aussi que x est soit 1 soit 2 car je le teste manuellement en utilisant x == 2...etc

La seule autre possibilité que je puisse penser est que x est un entier alors que les nombres renvoyés par sample ne le sont pas mais après vérification : (Remarquez que x = 2L après la sortie de la boucle)

> typeof(x)
[1] "integer"
> typeof(2)
[1] "double"
> x == 2
[1] TRUE

Je ne pense pas que ce soit le problème.
Des suggestions ?

1voto

akrun Points 148302

Parce que la boucle ne s'exécute qu'une seule fois, c'est-à-dire lors de la dernière itération. Cela a changé dans le vecteur de sortie Y

tail(Y)
#[1]  0  0  0  0  0 -1

À la place, ce serait 1:100

for(i in 1:100)

Le deuxième problème soulevé concerne le typeof 'x'. Ici, nous sampleons un entier avec 1:2 au lieu d'un vecteur numérique et cela renvoie le même type que l'entrée. Selon ?':'

Pour des arguments numériques, un vecteur numérique. Cela sera de type entier si from est de type entier et que le résultat est représentable dans le type entier R, sinon de type "double"

typeof(1:2)
#[1] "integer"
typeof(c(1, 2))
#[1] "double"

Une autre option si c'est une plage (:) est d'encadrer avec as.numeric

for (i in 1:100){
  x <- sample(as.numeric(1:2), 1)
  if (x == 2){
    Y[i] = 1
  }
  else{
    Y[i] = -1
  }
}

Vérifiez le type

typeof(Y)
#[1] "double"
typeof(x)
#[1] "double"

1voto

Dave2e Points 5768

De plus, R est un langage vectorisé donc ceci :

x<-sample(1:2, 100, replace = TRUE)
Y<-ifelse(x==2, 1, -1)

va s'exécuter environ 1000 fois plus vite que votre boucle.

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