2013-03-23 14 views
12

Cercavo un codice molto piccolo con if, anche se è molto semplice, ma c'è qualcosa che davvero confuso ecco il codicese l'istruzione in R può avere solo una riga?

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

come vediamo sopra, quando si esegue questo codice in R, arriva l'errore, ma se cambio l'istruzione if come questo

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

è ok, la mia domanda è che possiamo solo scrivere una riga sotto ogni giudizio? se voglio fare qualcosa di più dopo ogni giudice, cosa dovrei fare, proprio come in questo caso, voglio cambiare il valore di n, ma voglio anche mostrarlo, cosa dovrei fare? la ringrazio molto

+0

Sembra che tu possa venire da Python, dove gli spazi bianchi sono importanti. Come regola generale, la maggior parte delle lingue (R, C, Java, javascript) non si preoccupano degli spazi bianchi. Tutte le schede, i ritorni a capo e gli spazi che puoi inserire non cambiano nulla. Usano parentesi {} per raggruppare il codice insieme in blocchi. Le risposte esistenti menzionano questo, ma non come un'idea generale di alto livello. – mightypile

risposta

31

Per essere precisi, non si tratta di linee ma di circa dichiarazioni. Si può avere l'intero if else dichiarazione in una sola riga:

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

Una dichiarazione si concluderà alla fine della linea (se completo), si può vedere che bene in modalità interattiva se si immette il codice riga per riga:

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

if può venire in forma if (condition) statement o if (condition) statement else other.statement, l'interprete assume la prima edizione è adatta se la dichiarazione è completa dopo linea 2 - in modo interattivo, non può ragionevolmente aspettare se un else appare accanto. Questo è diverso nel codice d source - lì è chiaro con la riga successiva che lo forma.

virgola finire affermazioni così:

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

Ma si può avere solo una dichiarazione in ogni ramo della condizione.

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

Istruzioni di gruppo di parentesi graffe in modo che appaiano come un'unica istruzione.

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

grazie per la tua gentile replica, continuerò a vedere il file di aiuto, l'abilità in R è così bella – TOPMAD

9

Per dichiarazioni di gruppo, circondarli con le parentesi graffe, come hai fatto con il ciclo 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) 
} 

Questo vi permetterà di inserire più istruzioni all'interno del if, il else if e la finale else.

+0

grazie mille è molto gentile da parte di voi ragazzi – TOPMAD

+0

grazie mille – TOPMAD

11

È necessario utilizzare {} per consentire all'istruzione if di avere più di una riga. Prova questo:

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

grazie mille – TOPMAD

+1

Questo funziona solo perché è in un ciclo 'while'. Dalla [R Language Definition] (http://cran.r-project.org/doc/manuals/R-lang.html#if): "Quando l'istruzione if non è in un blocco, altrimenti, se presente, deve appare sulla stessa riga della fine dell'istruzione 2. Altrimenti, la nuova riga alla fine dell'istruzione2 completa l'if e produce un'istruzione sintatticamente completa che viene valutata. Una soluzione semplice consiste nell'utilizzare un'istruzione composta racchiusa tra parentesi, mettendo l'altro in la stessa linea della parentesi di chiusura che segna la fine della frase. " – GSee

+0

@Gsee, grazie per aver richiamato tale riferimento. –

0

Hai mai sentito parlare di barriere ricce?

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

grazie auguriamo buona giornata – TOPMAD

+1

sembra che questa risposta abbia molti downvotes. Mi chiedo perché sia ​​così? –

+2

@RicardoSaporta snarky commento? nessuna spiegazione? [Non ho minimizzato a proposito] La vergogna della gente non lascia commenti quando fanno downvote ... –

1

mentre la risposta diretta è, come è stato notato, l'uso di parentesi graffe;
vale la pena aggiungere che è possibile integrare l'operatore di assegnazione <- in molte funzioni.

Nel vostro caso specifico:

print(n <- 3*n+1) 

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


nota che l'utilizzo di = qui sarà NON lavoro. Deve essere <-

+0

Non è un problema per questo esempio, ma l'assegnazione avverrà solo se l'argomento viene effettivamente valutato nella funzione. L'effetto è come se l'espressione fosse passata alla funzione, piuttosto che al valore (come sarebbe in C/C++). Esempio: 'g <- function (x) {}; n <- 1; g (n <- 2); n' –

+0

@MatthewLundberg, assolutamente. Ecco perché ho qualificato la mia dichiarazione indicando che funziona con _many_ funzioni. :) –

Problemi correlati