2013-03-23 21 views
12

Tôi đã cố gắng một mã nhỏ với câu lệnh if, mặc dù nó rất đơn giản, nhưng có cái gì đó tôi thực sự bối rối ở đây là mãnếu tuyên bố trong R chỉ có thể có một dòng?

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

như chúng ta thấy ở trên, khi chạy mã này trong R, có đến lỗi, nhưng nếu tôi thay đổi câu lệnh if như thế này

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

thì ok, câu hỏi của tôi là chúng ta chỉ có thể viết một dòng dưới mỗi phán đoán? nếu tôi muốn làm điều gì đó sau mỗi thẩm phán, tôi nên làm gì, giống như trường hợp này, tôi muốn thay đổi giá trị của n, nhưng cũng muốn hiển thị nó, tôi phải làm gì? thank you very much

+0

Dường như bạn có thể đến từ python, nơi các khoảng trắng quan trọng. Theo nguyên tắc chung, hầu hết các ngôn ngữ (R, C, Java, javascript) không quan tâm đến khoảng trắng. Tất cả các tab, trả về vận chuyển và không gian bạn có thể nhập không thay đổi điều gì. Họ sử dụng dấu ngoặc {} để nhóm mã với nhau thành các khối. Câu trả lời hiện có đề cập đến điều này, nhưng không phải là một ý tưởng cấp cao chung. – mightypile

Trả lời

31

Để chính xác, đây không phải là dòng, mà là về các mệnh đề . Bạn có thể có toàn bộ tuyên bố if else trong một dòng:

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

Một tuyên bố sẽ kết thúc vào cuối dòng (nếu đầy đủ), bạn có thể thấy rằng độc đáo trong chế độ tương tác nếu bạn nhập dòng mã của dòng:

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

if có thể đến ở dạng if (condition) statement hoặc if (condition) statement else other.statement, người phiên dịch giả phiên bản đầu tiên có nghĩa là nếu báo cáo kết quả hoàn tất sau khi dòng 2 - trong chế độ tương tác nó không thể hợp lý chờ đợi xem một else xuất hiện bên cạnh. Điều này khác với mã source d - ở đó nó rõ ràng với dòng tiếp theo hình thành nó.

dấu chấm phẩy kết thúc báo cáo cũng như:

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

Nhưng bạn chỉ có thể có một tuyên bố trong mỗi chi nhánh của tình trạng này.

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

Ghi chú nhóm dấu ngoặc nhọn để chúng xuất hiện dưới dạng một câu lệnh.

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

cảm ơn bạn đã phát lại vui lòng, tôi sẽ tiếp tục xem tập tin trợ giúp, kỹ năng trong R rất đẹp – TOPMAD

9

Để báo cáo nhóm, bao quanh chúng với dấu ngoặc nhọn như bạn đã làm với while loop:

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

Điều này sẽ cho phép bạn đặt nhiều câu lệnh bên trong if, các else if và cuối cùng else.

+0

cảm ơn một triệu nó là rất loại của các bạn – TOPMAD

+0

cảm ơn bạn rất nhiều – TOPMAD

11

Bạn phải sử dụng {} để cho phép câu lệnh if có nhiều hơn một dòng. Hãy thử điều này:

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

cảm ơn bạn rất nhiều – TOPMAD

+1

Điều này chỉ hoạt động bởi vì nó là trong một vòng lặp 'while'. Từ [Định nghĩa ngôn ngữ R] (http://cran.r-project.org/doc/manuals/R-lang.html#if): "Khi câu lệnh if không nằm trong một khối khác, nếu có, phải xuất hiện trên cùng một dòng với phần cuối của câu lệnh 2. Nếu không thì dòng mới ở phần cuối của câu lệnh 2 sẽ hoàn thành if và sinh ra một câu lệnh hoàn thành cú pháp được đánh giá. Một giải pháp đơn giản là sử dụng một câu lệnh ghép trong các dấu ngoặc, đặt một câu lệnh khác vào cùng dòng với dấu ngoặc đóng dấu kết thúc câu lệnh. " – GSee

+0

@Gsee, cảm ơn vì đã kéo tham chiếu đó lên. –

0

Đã bao giờ nghe nói về các dấu gạch chéo không?

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

cảm ơn bạn chúc bạn có một ngày tốt lành – TOPMAD

+1

có vẻ như câu trả lời này có rất nhiều downvotes. Tôi tự hỏi tại sao vậy? –

+2

@RicardoSaporta nhận xét không rõ ràng? Không có lời giải thích? [Tôi đã không downvote bằng cách] Xấu hổ mọi người không để lại ý kiến ​​khi họ downvote ... –

1

trong khi câu trả lời trực tiếp, như đã lưu ý, sử dụng dấu ngoặc nhọn;
điều đáng giá là bạn có thể tích hợp toán tử gán <- vào nhiều chức năng.

Trong trường hợp cụ thể của bạn:

print(n <- 3*n+1) 

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


lưu ý rằng việc sử dụng = đây sẽ KHÔNG làm việc. Phải là <-

+0

Nó không phải là một vấn đề cho ví dụ này, nhưng nhiệm vụ sẽ chỉ xảy ra nếu đối số thực sự được đánh giá trong hàm. Hiệu ứng như thể biểu thức được truyền cho hàm, chứ không phải giá trị (như trong C/C++). Ví dụ: 'g <- function (x) {}; n <- 1; g (n <- 2); n' –

+0

@MatthewLundberg, tuyệt đối. Đó là lý do tại sao tôi đủ điều kiện tuyên bố của tôi chỉ ra rằng nó hoạt động với các hàm _many_. :) –

Các vấn đề liên quan