2013-03-23 11 views
12

Ich war mit if-Anweisung einen kleinen Code versucht, obwohl es sehr einfach ist, aber es ist etwas, was ich ist der Codewenn Anweisung in R nur eine Zeile haben kann?

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) 
    } 

wie wir oben wirklich hier verwirrt, sehen, wenn Sie diesen Code in R ausgeführt wird, es kommt der Fehler, aber wenn ich die if-Anweisung wie dies

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

es in Ordnung zu ändern ist, ist meine Frage, dass wir nur eine Zeile unter jedem Urteil schreiben? Wenn ich nach jedem Richter etwas mehr machen will, was soll ich tun, genau wie in diesem Fall, möchte ich den Wert von n ändern, aber auch anzeigen, was soll ich tun? ich danke Ihnen sehr

+0

Das sieht aus, als ob Sie von Python kommen, wo Whitespace von Bedeutung ist. In der Regel sind die meisten Sprachen (R, C, Java, Javascript) nicht auf Leerzeichen beschränkt. Alle Registerkarten, Zeilenumbrüche und Leerzeichen, die Sie eingeben können, ändern nichts. Sie verwenden Klammern {}, um Code in Blöcken zu gruppieren. Bestehende Antworten erwähnen dies, aber nicht als eine allgemeine Idee auf hoher Ebene. – mightypile

Antwort

31

Um genau zu sein, geht es hier nicht um Linien sondern um Aussagen. Sie können die ganze if else Anweisung in einer Zeile haben:

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

Eine Erklärung am Ende der Zeile endet (wenn abgeschlossen ist), können Sie das schön im interaktiven Modus sehen, ob Sie den Code Zeile für Zeile eingeben:

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

if kann in Form kommen if (condition) statement oder if (condition) statement else other.statement nimmt der Dolmetscher die erste Version gemeint ist, wenn die Anweisung nach Zeile abgeschlossen ist 2 - im interaktiven Modus kann es nicht sinnvoll warten, ob ein else nächste erscheint. Dies ist in source d-Code anders - da ist es klar mit der nächsten Zeile, welche Form es ist.

Semikolons Anweisungen enden auch:

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

Aber Sie nur eine Anweisung in jedem Zweig des Zustandes haben können.

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

Curly Klammern Gruppenanweisungen, so dass sie als eine Aussage erscheinen.

> if (TRUE) {1; 2} else 3 
[1] 2 
+0

Vielen Dank für Ihre freundliche Wiederholung, ich werde weiterhin die Hilfe-Datei sehen, die Fähigkeit in R ist so schön – TOPMAD

9

Um Gruppen Aussagen, umgeben sie mit geschweiften Klammern, wie Sie mit der Schleife while getan haben:

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) 
} 

Dies ermöglicht es Ihnen, mehrere Anweisungen innerhalb des if, die else if und das platzieren endgültige else.

+0

danke eine million es ist sehr nett von euch – TOPMAD

+0

vielen dank – TOPMAD

11

Sie müssen {} verwenden, damit die Anweisung if mehr als eine Zeile haben kann. Versuchen Sie dies:

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) 
    } 
} 
+1

vielen dank – TOPMAD

+1

Das funktioniert nur, weil es in einer 'while' schleife ist. Aus der [R Sprachdefinition] (http://cran.r-project.org/doc/manuals/R-lang.html#if): "Wenn die if-Anweisung nicht in einem Block ist, muss der else, falls vorhanden, dies tun erscheinen in der gleichen Zeile wie das Ende von Anweisung 2. Andernfalls vervollständigt die neue Zeile am Ende von Anweisung2 das if und liefert eine syntaktisch vollständige Anweisung, die ausgewertet wird.Eine einfache Lösung besteht darin, eine zusammengesetzte Anweisung in geschweiften Klammern zu verwenden und die else einzuschalten die gleiche Zeile wie die schließende Klammer, die das Ende der Aussage markiert. " – GSee

+0

@Gsee, danke, dass du diese Referenz hochgezogen hast. –

0

Haben Sie jemals von lockigen Barces gehört?

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

Danke, dass Sie einen guten Tag haben – TOPMAD

+1

es sieht aus wie diese Antwort eine Menge downvotes hat. Ich frage mich, warum das ist? –

+2

@RicardoSaporta snarky Kommentar? keine Erklärung? [Ich habe übrigens nicht abgeschrieben] Schande Leute hinterlassen keine Kommentare, wenn sie downvote ... –

1

während die direkte Antwort ist, wie bereits erwähnt wurde, geschweifte Klammern zu verwenden;
Es lohnt sich hinzuzufügen, dass Sie den Zuweisungsoperator in viele Funktionen integrieren können.

In Ihrem speziellen Fall:

print(n <- 3*n+1) 

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


zur Kenntnis, dass mit = hier wird NICHT Arbeit. Es muss sein <-

+0

Es ist kein Problem für dieses Beispiel, aber die Zuweisung wird nur auftreten, wenn das Argument tatsächlich in der Funktion ausgewertet wird. Der Effekt ist so, als ob der Ausdruck an die Funktion und nicht an den Wert übergeben würde (wie in C/C++). Beispiel: 'g <- function (x) {}; n <-1; g (n <- 2); n' –

+0

@MatthewLundberg, absolut. Deshalb habe ich meine Aussage dahingehend qualifiziert, dass sie mit _many_ functions funktioniert. :) –

Verwandte Themen