2014-09-17 14 views
14

Tôi hiểu theo cách thông thường để viết một "nếu - else if" tuyên bố như sau:nếu - else if - else statement và khung

if (2==1) { 
    print("1") 
} else if (2==2) { 
    print("2") 
} else { 
    print("3") 
} 

hoặc

if (2==1) {print("1") 
} else if (2==2) {print("2") 
} else print("3") 

Ngược lại, Nếu tôi viết theo cách này

if (2==1) { 
    print("1") 
} 
else if (2==2) { 
    print("2") 
} 
else (print("3")) 

hoặc theo cách này:

if (2==1) print("1") 
else if (2==2) print("2") 
else print("3") 

tuyên bố KHÔNG hoạt động. Bạn có thể giải thích cho tôi lý do tại sao }else hoặc else if phải nằm trong cùng một dòng không? Có cách nào khác để viết câu lệnh if-else if-else trong R, đặc biệt là không có dấu ngoặc?

+2

Khi ban đầu 'if' được theo sau bởi một biểu thức hợp chất (được chỉ ra bởi' {} 'cặp) theo mặc định, trình phân tích cú pháp sẽ mong đợi biểu thức được theo sau bởi 'else' khác. Việc sử dụng 'else' được định nghĩa duy nhất là với các biểu thức phức. Điều này thậm chí được ghi trong tài liệu: 'if (cond) cons.expr else alt.expr' trong đó' cons.expr' và 'alt.expr' được định nghĩa là hợp chất. Như @Berry đã chỉ ra, bạn có thể sử dụng cách R phân tích các định nghĩa hàm để làm việc xung quanh việc này, nhưng tốt hơn là nên nhất quán trong việc sử dụng khung (IMO). – hrbrmstr

+0

cũng nếu bạn bọc bất thường if-else trong ngoặc '{bad if-else expr}' hoặc trong một hàm phổ biến hơn 'function() {bad if-else expr}', nó sẽ hoạt động – rawr

+0

Có thể trùng lặp của [ Bất ngờ 'else' trong lỗi "else"] (http://stackoverflow.com/questions/14865435/unexpected-else-in-else-error) –

Trả lời

21

R đọc các lệnh này theo từng dòng, do đó, nó cho rằng bạn đã hoàn tất sau khi thực hiện biểu thức sau câu lệnh if. Hãy nhớ rằng bạn có thể sử dụng ifmà không cần thêm else.

Ví dụ thứ ba của bạn sẽ hoạt động trong một hàm, vì toàn bộ hàm được xác định trước khi được thực hiện, vì vậy R biết chưa được thực hiện (sau if() do).

+0

Tôi đã thử nó trong một hàm và cả ví dụ thứ 3 và thứ 4 của tôi hoạt động trong chức năng. Cảm ơn – MasterJedi

+2

Điều này được đề cập trong mục R-inferno, phần 8.1.43 btw. –

-3

đó là ý tưởng tốt để sử dụng niềng răng khi có lồng ifs.For Ví dụ, trong

if(n>0) 
    if(a>b) 
     z=a; 
    else 
     z=b; 

các khác đi với bên nếu không muốn nói với if (n> 0) .Nếu đó không phải là những gì bạn muốn , niềng răng phải được sử dụng để buộc hiệp hội thích hợp:

if(n>0){ 
    if(a>b) 
     z=a; 
} 
else 
    z=b; 

Xem chi tiết, hướng dẫn hoàn chỉnh rất tốt: Conditional statements: if-else, else-if and switch in C ! Hy vọng điều này sẽ giúp bạn!

+4

Câu hỏi này dành riêng cho R, nhưng bạn giả sử cú pháp C. Như bạn thấy từ các câu trả lời khác, trình phân tích cú pháp R có một số quirks không áp dụng cho ví dụ C của bạn. Lời khuyên cho tương lai: xin vui lòng ở lại chủ đề của câu hỏi. –

+0

Ngay cả khó khăn câu trả lời là hoàn toàn tốt đẹp (tôi không nói langage khôn ngoan, nhưng cách khôn ngoan), cố gắng liên kết chỉ tài nguyên có liên quan, tài nguyên của bạn là cho C khi OP đang yêu cầu R –

3

Trong R, chúng tôi cũng có ifelse() chức năng:

ifelse(1 < 0, "hello", "hi") 

Output:

# [1] "hi" 
0

Như hrbrmstr đã đề cập:

Khi ban đầu nếu được theo sau bằng biểu thức phức hợp (được biểu thị bằng cặp {}) rser theo mặc định là sẽ mong đợi biểu thức tiếp theo là khác để được hợp chất là tốt. Việc sử dụng chỉ được xác định khác là với các biểu thức phức.

Trong tuyên bố if(cond) cons.expr else alt.expr, else cần phải được đặt sau và cùng dòng với hợp chất `cons.expr 'cuối.

Vì vậy, nếu bạn muốn có mã của bạn một cái nhìn tốt hơn mà không cần dấu ngoặc, áp dụng theo cách này:

if (2==1) print("1") else 
    if (2==2) print("2") else 
     print("3")