web-dev-qa-db-fra.com

si l'instruction dans R ne peut avoir qu'une seule ligne?

J'essayais un petit code avec l'instruction if, bien que ce soit très simple, mais il y a quelque chose que je confond vraiment ici, c'est le code

n<-857
while(n!=1){
if(n<=0)
 print("please input a positive integer")
else if(n%%2==0)
 n<-n/2
 print(n)
else
 n<-3*n+1
 print(n)
  }

comme nous le voyons ci-dessus, lors de l'exécution de ce code dans R, il y a l'erreur, mais si je change l'instruction if comme ceci

if(n<=0)
     print("please input a positive integer")
    else if(n%%2==0)
     n<-n/2
    else
     n<-3*n+1

c'est ok, ma question est que peut-on écrire une seule ligne sous chaque jugement? si je veux faire quelque chose de plus après chaque juge, que dois-je faire, comme dans ce cas, je veux changer la valeur de n, mais aussi l'afficher, que dois-je faire? Merci beaucoup

19
TOPMAD

Pour être précis, il ne s'agit pas de lignes mais de déclarations. Vous pouvez avoir l'intégralité de l'instruction if else Sur une seule ligne:

> if (TRUE) 1 else 3
[1] 1

Une instruction se terminera à la fin de la ligne (si elle est complète), vous pouvez le voir bien en mode interactif si vous entrez le code ligne par ligne:

> if (TRUE) 
+ 1
[1] 1
> else
Fehler: Unerwartete(s) 'else' in "else" # error: unexpected 'else' in "else"
> 3
[1] 3

if peut se présenter sous la forme if (condition) statement ou if (condition) statement else other.statement, l'interpréteur suppose que la première version est destinée si l'instruction est terminée après la ligne 2 - en mode interactif, elle ne peut pas raisonnablement attendre si un else apparaît ensuite. C'est différent dans le code sourced - il est clair avec la ligne suivante de quelle forme il s'agit.

Les points-virgules terminent également les instructions:

> if (TRUE) 1; else 3
[1] 1
Fehler: Unerwartete(s) 'else' in " else"  # error: unexpected 'else' in "else"

Mais vous ne pouvez avoir qu'un instruction dans chaque branche de la condition.

> if (TRUE) 1; 2 else 3
[1] 1
Fehler: Unerwartete(s) 'else' in " 2 else" # error: unexpected 'else' in "2 else"

Les accolades regroupent les instructions afin qu'elles apparaissent comme une seule instruction.

> if (TRUE) {1; 2} else 3
[1] 2
43
cbeleites

Vous devez utiliser {} for permet à l'instruction if d'avoir plusieurs lignes. Essaye ça:

n<-857
while(n!=1){
  if(n<=0){
    print("please input a positive integer")
  }

  else if(n%%2==0){
    n<-n/2
    print(n)
  }
    else {
      n<-3*n+1
      print(n)
    }
}
12
Jilber Urbina

Pour regrouper des instructions, entourez-les d'accolades comme vous l'avez fait avec la boucle while:

if(n<=0) {
     print("please input a positive integer")
} else if(n%%2==0) {
     n<-n/2
     print(n)
} else {
     n<-3*n+1
     print(n)
}

Cela vous permettra de placer plusieurs instructions dans le if, le else if et la finale else.

10
NPE

tandis que la réponse directe est, comme cela a été noté, d'utiliser des accolades;
il convient d'ajouter que vous pouvez intégrer le <- opérateur d'affectation dans de nombreuses fonctions.

Dans votre cas particulier:

    print(n <- 3*n+1)

   ## instead of 
   #  n <- 3*n+1
   #  print(n)

notez que l'utilisation de = ici --- PAS fonctionnera. Ce doit être <-

1
Ricardo Saporta

Avez-vous déjà entendu parler de barbes bouclées?

n<-857
while(n!=1){
    if(n<=0) {
        print("please input a positive integer")
    } else if(n%%2==0) {
        n<-n/2
        print(n)
    } else {
        n<-3*n+1
        print(n)
    }
}
0
Henrik