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 <-?
Trả lời
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à) .
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: =. –
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, <-
và <<-
đã đượ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]
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
@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'. –
- 1. Tại sao quá tải đúng và sai thay vì xác định toán tử bool?
- 2. Biến lớp được định nghĩa tại @implementation thay vì @interface?
- 3. Tại sao có quá nhiều ngôn ngữ web được giải thích thay vì được biên dịch?
- 4. Tại sao tôi nên POST dữ liệu thay vì GET?
- 5. Tại sao scala.math.PartialOrdering.lteq trừu tượng, thay vì được định nghĩa trong điều khoản của .tryCompare?
- 6. Tại sao có thể đặt định nghĩa chức năng người bạn bên trong định nghĩa lớp?
- 7. Tại sao không có chuỗi quá tải.Split (chuỗi) quá tải?
- 8. Tại sao Attributes.IsDefined() thiếu quá tải?
- 9. Tại sao NDEBUG thay vì RELEASE?
- 10. Tại sao Clojure có 5 cách để xác định một lớp thay vì chỉ một?
- 11. Tại sao tải lên quá chậm?
- 12. NHibernate có thể tồn tại trong các tệp phẳng thay vì cơ sở dữ liệu không?
- 13. Tại sao dữ liệu số nguyên tràn âm thầm thay vì ném ngoại lệ
- 14. tại sao std :: string s ("?? <") xuất một {thay vì ?? <như mong đợi?
- 15. Tại sao phương pháp quá tải không được gọi?
- 16. Tại sao chọn Func <T,bool> thay vì Predicate <T>?
- 17. Tại sao không thể quá tải được thực hiện tại thời gian truy tố?
- 18. Tại sao cấu trúc sockaddr_storage được định nghĩa như cách nó được định nghĩa?
- 19. Tại sao CHỌN 0, ... thay vì CHỌN
- 20. Tại sao Matlab được viết bằng C thay vì Fortran?
- 21. Tại sao nosql với cassandra thay vì mysql?
- 22. python total_ordering: tại sao __lt__ và __eq__ thay vì __le__?
- 23. Tại sao nhập javax.swing. * Thay vì java.swing. *
- 24. Tại sao "htmlspecialchars" quá chậm?
- 25. Tại sao darcs thay vì git?
- 26. Tại sao tôi nên sử dụng <ARGV> hoặc <> thay vì <STDIN> trong Perl?
- 27. Tại sao testFixture thay vì TestClass?
- 28. Tại sao sử dụng ROLAP thay vì MySQL đơn giản?
- 29. Tại sao chặn thay vì lặp?
- 30. Tại sao FloatBuffer thay vì phao []?
Hãy để tôi đoán: Để tỏ lòng kính trọng Pascal !!! – Iterator
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 :) –
Ai đó có thể giải thích "quá tải <-" có nghĩa là gì? – Michael