2012-06-08 27 views
6

The manual trạng thái:Tại sao toán tử "=" R không được sử dụng trong các hàm?

Nhà điều hành '< -' có thể được sử dụng bất cứ nơi nào, trong khi các nhà điều hành '=' chỉ được phép ở cấp cao nhất (ví dụ: trong diễn tả trọn vẹn gõ tại dấu nhắc lệnh) hoặc là một trong số của các biểu thức con trong danh sách các biểu thức được kết hợp nhanh.

The question here đề cập đến sự khác biệt khi được sử dụng trong cuộc gọi chức năng. Nhưng trong định nghĩa chức năng, có vẻ như hoạt động bình thường:

a = function() 
{ 
    b = 2 
    x <- 3 
    y <<- 4 
} 

a() 
# (b and x are undefined here) 

Vậy tại sao hướng dẫn sử dụng đề cập đến the operator ‘=’ is only allowed at the top level ??

Có gì về nó trong language definition là (không có = hành niêm yết, thật là một sự xấu hổ!)

+0

Nó được đề cập trong R-lang trong [phần 10.4.2 Nhà khai thác tiền tố và tiền tố] (http://cran.r-project.org/doc/manuals/R-lang.html#Infix-and-prefix-operators), nhưng không nói nhiều hơn những gì trong mục trợ giúp mà bạn đã đề cập. –

+5

Văn bản bạn trích dẫn cho biết "ở cấp cao nhất ** HOẶC ** trong danh sách các biểu thức phụ được chuẩn bị sẵn". Bạn đang sử dụng nó trong một danh sách các biểu thức phụ được chuẩn bị sẵn sàng. Được phép. – Andrie

+5

Bạn phải đi đến độ dài lớn để tìm thấy một biểu thức mà không phải là toplevel cũng không phải trong niềng răng. Đây là một. Đôi khi bạn muốn bọc một nhiệm vụ bên trong một 'try' block:' try (x <- f()) 'là tốt, nhưng' try (x = f (x)) 'không phải là - bạn cần phải thay đổi toán tử gán hoặc thêm niềng răng. –

Trả lời

12

Văn bản bạn trích dẫn nói at the top level OR in a braced list of subexpressions. Bạn đang sử dụng nó trong một danh sách các biểu thức phụ được chuẩn bị sẵn sàng. Được phép.

Bạn phải đi đến độ dài lớn để tìm thấy một biểu thức không phải là toplevel cũng không phải trong niềng răng. Đây là một. Đôi khi bạn muốn bọc một bài tập bên trong khối thử: try(x <- f()) là tốt, nhưng try(x = f(x)) thì không - bạn cần phải thay đổi toán tử gán hoặc thêm dấu ngoặc.

+0

Vincent, cảm ơn bạn nhưng câu trả lời này như thế nào câu hỏi của tôi về 'b = 2' là sai trong ví dụ của tôi? Có lẽ tôi bỏ lỡ một cái gì đó vì vậy sau đó xin giải thích một cách rõ ràng hơn :) – TMS

+0

@Tomas Tôi đã thêm nhận xét của tôi mà bạn thấy hữu ích.Tôi nghĩ rằng điều này trả lời câu hỏi. – Andrie

+0

Cảm ơn Andrie, tuyệt vời! – TMS

7

Expressions không ở cấp cao nhất bao gồm việc sử dụng trong cấu trúc điều khiển như if. Ví dụ, lỗi lập trình sau đây là bất hợp pháp.

> if(x = 0) 1 else x 
Error: syntax error 

Như đã đề cập ở đây: https://stackoverflow.com/a/4831793/210673

Xem thêm http://developer.r-project.org/equalAssign.html

+0

cảm ơn bạn về [liên kết thứ hai] (http://developer.r-project.org/equalAssign.html)! Các thông tin quan trọng nhất có: * "Ở đâu nó được cho phép, toán tử' = 'tương đương ngữ nghĩa với tất cả các bài tập trước đó (tức là' <-' và các phần khác). "* – TMS

3

Khác với một số ví dụ như system.time khi những người khác đã chỉ ra nơi <-= có các kết quả khác nhau, sự khác biệt chính là có nhiều triết lý hơn. Larry Wall, người sáng tạo của Perl, nói điều gì đó dọc theo dòng "những thứ tương tự sẽ trông giống nhau, những thứ khác nhau sẽ khác", tôi thấy nó thú vị bằng các ngôn ngữ khác nhau để xem những thứ được xem là "tương tự" và được xem là " khác nhau". Bây giờ cho phân R chúng ta hãy so sánh 2 lệnh:

myfun(a <- 1:10) 

myfun(a = 1:10) 

Một số người lập luận rằng trong cả hai trường hợp chúng ta đang gán 1:10 để a vì vậy những gì chúng tôi đang làm cũng tương tự.

Đối số khác là trong cuộc gọi đầu tiên chúng tôi được gán cho một biến a đó là trong cùng một môi trường mà từ đó myfun đang được kêu gọi và trong cuộc gọi thứ hai chúng ta đang gán cho một biến a đó là trong môi trường tạo khi hàm được gọi và là địa phương cho hàm và hai biến số a khác nhau.

Vì vậy, việc sử dụng nào tùy thuộc vào việc bạn xem xét các bài tập "tương tự" hay "khác".

Cá nhân tôi thích <-, nhưng tôi không nghĩ rằng nó đáng để chiến đấu với cuộc chiến thánh thiện.

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