2017-10-13 1 views
1

J'utilisé pour écrire des boucles dans R commetraduire correctement `for (int i = 1; i <= taille; i ++)` dans R (cas `la taille <1`)

for(i in 1:size) { ... } 

et je pensais qu'il était équivalent de

for(int i = 1; i <= size; i++) { ... } 

mais je viens de réaliser que si size == 0 R entre dans la boucle parce que de toute façon 1:size = [1 0] et donc mon code se comporte tout à fait tort.

Alors, quelle est la vraie façon norme de traduction du C pour la boucle, j'ai écrit ci-dessus, de sorte que si le programme size < 1 ne pénètre pas dans la boucle?

+1

'si (taille> = 1) (i en 1: taille) {...}' – jogo

+1

@jogo oui je me suis retrouvé avec la même solution de contournement, est-ce la façon standard de le faire? – Nisba

+0

Il conserve la logique de la boucle C-for. Que voulez-vous dire par "façon standard"? Qui devrait définir la normalisation? – jogo

Répondre

1

Vous pouvez utiliser base::seq_len:

foo <- 2 
bar <- 0 

for (i in seq_len(foo)) {print(i)} 
[1] 1 
[1] 2 
# No output 
for (i in seq_len(bar)) {print(i)} 
2

En supposant que size est une certaine taille de votre objet, par exemple length(vec) ou nrow(df), vous pouvez utiliser seq_along comme ci-dessous:

x = NULL 
for (i in seq_along(x)) print(x[i]) 
2

Si la taille est à l'origine de la longueur d'un vecteur, la manière standard est

for (i in seq_along(myvector)) {...} 

qui se comportera correctement si myVector a une longueur nulle. Donc, vous pourrait même faire

for (i in seq_along(numeric(size))) {...} 

mais qui serait certainement pas être considéré comme « standard ».

Comme il est indiqué dans les commentaires (et dans une autre réponse) est la meilleure façon

for (i in seq_len(size)) {...} 
+0

Deuxième exemple est redondant, mieux utiliser 'seq_len (size)' comme suggéré par PoGibas. – Tim