2011-08-11 23 views
38

data.table đã giới thiệu toán tử = =. Tại sao không quá tải < -?Tại sao dữ liệu có thể được định nghĩa: = thay vì quá tải <-?

+0

Hãy để tôi đoán: Để tỏ lòng kính trọng Pascal !!! – Iterator

+0

Tôi đoán vậy! Chúng tôi không thể chọn bất kỳ nhà điều hành nào, nó chỉ là (may mắn thay) R cho phép: = được xác định. Nếu không, chúng ta có thể vui vẻ và định nghĩa + =, - =, ~ = etc :) –

+1

Ai đó có thể giải thích "quá tải <-" có nghĩa là gì? – Michael

Trả lời

14

Tôi không nghĩ có bất kỳ lý do kỹ thuật nào cần thiết, vì lý do sau: := chỉ được sử dụng bên trong [...] để luôn được trích dẫn. [...] đi qua cây biểu thức để xem liệu có := trong đó không.

Điều đó có nghĩa là nó không thực sự hoạt động như một nhà điều hành và nó không thực sự quá tải; vì vậy họ có thể chọn khá nhiều bất kỳ nhà điều hành nào họ muốn. Tôi đoán có lẽ nó trông đẹp hơn? Hoặc ít bối rối vì rõ ràng không phải là <-?

(Lưu ý rằng nếu := đã được sử dụng bên ngoài của [...] nó không thể <-, bởi vì bạn không thể thực sự quá tải <-. <- Không đánh giá lập luận bên trái của nó vì vậy nó không biết những gì loại là) .

+6

Vâng, đó là khá nhiều. Chúng tôi đã thử <- trước tiên nhưng điều đó đã không bay vì mã người dùng đã được sử dụng <- trong j ví dụ: tăng bộ đếm nhóm. Sau đó, chúng tôi đã thử << - nhưng mọi người đã sử dụng nó trong j quá, để gán cho .GlobalEnv. Vì vậy, sau đó chúng tôi nhấn khi: =. –

25

Có hai nơi mà <- thể 'quá tải':

x[i, j] <- value   # 1 
x[i, {colname <- value}] # 2 

Một bản sao đầu tiên toàn bộ x-*tmp*, thay đổi mà bản sao làm việc, và gán trở lại x. Đó là một điều R (src/main/eval.c và subassign.c) được thảo luận gần đây trên r-devel here. Có vẻ như có thể thay đổi R để cho phép các gói, hoặc R chính nó, để tránh bản sao đó đến *tmp*, nhưng hiện tại không thể, IIUC.

Câu hỏi thứ hai là câu trả lời của Owen, tôi nghĩ vậy. Nếu bạn chấp nhận việc chuyển nhượng bằng cách tham chiếu trong phạm vi j tương tự như vậy thì nhà điều hành nào? Theo nhận xét cho câu trả lời của Owen, <-<<- đã được người dùng sử dụng trong j, vì vậy chúng tôi nhấn vào :=.

Thậm chí nếu [<- không sao chép toàn bộ x, chúng tôi vẫn thích := trong j vì vậy chúng tôi có thể làm những việc như thế này:

DT[,{newcol1:=sum(a) 
    newcol2:=a/newcol1}, by=group] 

Trường hợp cột mới được bổ sung bằng cách tham chiếu để bàn, và RHS của mỗi := được đánh giá trong mỗi nhóm. (Thời gian:. = Trong nhóm được thực hiện)


Cập nhật Oct 2012

Tính đến 1.8.2 (trên cran trong tháng 7 năm 2012), :=theo nhóm được thực hiện để thêm hoặc cập nhật các cột đơn; tức là, LHS đơn lẻ của :=. Và bây giờ trong v1.8.3 (trên R-Forge tại thời điểm viết), nhiều cột có thể được thêm vào theo nhóm; ví dụ.,

DT[, c("newcol1","newcol2") := .(sum(a),sum(b)), by=group] 

hoặc, có lẽ tao nhã hơn:

DT[,`:=`(newcol1=sum(a), 
     newcol2=sum(b)), by=group] 

Nhưng lặp nhiều RHS, dự kiến ​​trong một thời gian, nơi mà các biểu hiện thứ 2 có thể sử dụng kết quả từ lần đầu tiên, không được thực hiện (FR#1492). Vì vậy, điều này sẽ vẫn cung cấp lỗi "newcol1 not found" và cần phải được thực hiện theo hai bước:

DT[,`:=`(newcol1=sum(a), 
     newcol2=a/newcol1), by=group] 
+3

Chỉ là một điều nhỏ, 'x [i, j] <- value' không thực sự quá tải' <-', thay vì '<-' làm những gì nó luôn thực hiện bằng cách ủy thác cho' [<-' (dựa trên biểu thức , không phải loại giá trị). – Owen

+0

@Owen Ah vâng, điểm tốt. Đã chỉnh sửa và thêm dấu ngoặc kép xung quanh 'quá tải'. –

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