2014-10-09 15 views
19

Tôi đã đi qua gói phổ biến data.table và một điều đặc biệt hấp dẫn tôi. Nó có một toán tử gán tại chỗTại sao: = được phép làm toán tử kết hợp?

:=

này không được định nghĩa trong cơ sở R. Trong thực tế nếu bạn không tải gói data.table, nó đã có thể đưa ra một lỗi nếu bạn đã cố gắng sử dụng nó (ví dụ , a := 2) với thông báo:

Error: could not find function ":="

Ngoài ra, tại sao := hoạt động? Tại sao R cho phép bạn xác định := là toán tử kết hợp trong khi mọi hàm infix khác phải được bao quanh bởi %%, ví dụ:

`:=` <- function(a, b) { 
    paste(a,b) 
} 

"abc" := "def" 

Rõ ràng nó không có nghĩa là một cú pháp thay thế cho %function.name% để xác định chức năng trộn. Có phải data.table đang khai thác một số quirks phân tích cú pháp của R? Nó là một hack? Nó sẽ được "vá" trong tương lai?

+5

Vui lòng xem tài liệu data.table, bắt đầu có thể với Câu hỏi thường gặp. –

+1

@DirkEddelbuettel. Tôi hiểu cách nó được sử dụng trong data.table. Nhưng thực tế R cho phép một nhà điều hành như vậy được xác định và không gây ra lỗi cú pháp là điều khiến tôi tò mò. Đó là một câu hỏi cơ bản về R và có thể nó phân tích mã như thế nào. – xiaodai

+2

AFAIK nó là địa phương để data.table và chỉ hoạt động với '[' subsetting. Vì vậy, câu hỏi của bạn là off-base (không phải là một quirk R) đó là lý do tại sao tôi đã gửi cho bạn các tài liệu data.table * mà thảo luận về điều này *. –

Trả lời

29

Đó là điều mà trình phân tích cú pháp R cơ sở nhận ra và dường như phân tích cú pháp dưới dạng gán trái (ít nhất là về mặt hoặc thứ tự các thao tác và như vậy). Xem C source code để biết thêm chi tiết.

as.list(parse(text="a:=3")[[1]]) 
# [[1]] 
# `:=` 
# 
# [[2]] 
# a 
# 
# [[3]] 
# [1] 3 

Theo như tôi có thể nói nó không có giấy tờ (về cơ sở R). Nhưng đó là một chức năng/nhà điều hành bạn có thể thay đổi hành vi của

`:=`<-function(a,b) {a+b} 
3 := 7 
# [1] 10 

Như bạn có thể thấy thực sự không có gì đặc biệt về phần ":". Nó chỉ xảy ra là sự bắt đầu của một mã thông báo hợp chất.

+0

Eww. Đừng nghĩ đó là một ý kiến ​​hay. Nó được ghi lại: '? ': ='' Sẽ trả về một trang trợ giúp nếu pkg: data.table được nạp. –

+12

@BondedDust Nhưng 'data.table' không * sở hữu * chức năng đó. Họ thực sự đang dựa vào thứ gì đó nằm xung quanh trong trình phân tích cú pháp mà họ không kiểm soát được. Một gói khác có thể xác định lại 'c' nếu họ muốn. Đó là bản chất những gì họ đang làm (chỉ xảy ra là không thực hiện mặc định cho ': =') – MrFlick

+1

OP đã đề cập đến gói data.table vì vậy tôi sẽ cho rằng trong thiết lập đó ': =' là "sở hữu" bởi dữ liệu. bàn.Tôi cho rằng tôi sẽ đồng ý với bạn nếu bạn lập luận rằng hàm thời gian ('.()') Có quyền sở hữu riêng biệt (địa phương hóa) bằng các hàm 'bquote' và plyr. Và theo quan điểm của tôi, việc xác định lại 'c()' cũng là một ý tưởng tồi. –

6

Nó không chỉ là toán tử kết nối mà là := là một toán tử đơn được tạo thành bởi dấu hai chấm và dấu bằng (giống như sự kết hợp của "<" và "-" tạo toán tử gán trong cơ sở R). Toán tử := là một hàm infix được định nghĩa là một phần của việc đánh giá đối số "j" bên trong hàm [.data.table. Nó tạo ra hoặc gán một giá trị cho một cột được chỉ định bởi đối số LHS của nó bằng cách sử dụng kết quả đánh giá RHS của nó.

+3

Đối với những người giải quyết không giải thích được mối quan ngại của họ. Câu trả lời này được viết để trả lời câu hỏi như ban đầu được viết. Bạn có thể xem tiêu đề và nội dung gốc của nó bằng cách nhấp vào liên kết "đã chỉnh sửa ....". –

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