2013-05-13 46 views
6
> within(list(a="a",b="b"), c="c") 
Error in eval(expr, envir, enclos) : argument is missing, with no default 
> within(list(a="a",b="b"), c<-"c") 
$a 
[1] "a" 

$b 
[1] "b" 

$c 
[1] "c" 

Tôi không chắc chắn lý do chính xác hai lý do này không nên tương đương. Có vẻ như phiên bản = được hiểu là một đối số có tên là c trong phạm vi vì số .... Có cách nào để vô hiệu hóa hành vi này không? Tôi đã thử,Tại sao = và <- không tương đương trong phạm vi()?

within(list(a="a",b="b"), `c`="c") 

nhưng điều đó cũng không thành công.

+1

Đối với lý do tương tự mà 'system.time (x = rnorm (1e300))' doesn 't làm việc. –

+7

Nếu '=' là hàm gọi hàm đầu tiên trong biểu thức được truyền cho một hàm, thì '=' được hiểu là phép gán đối số. So sánh với 'bên trong (danh sách (a =" a ", b =" b "), {c =" c "})' –

+0

dấu = như một nhiệm vụ là các hàm bên trong sôi nổi, R bị nhầm lẫn cho dù đó là bài tập hay một cuộc tranh cãi. –

Trả lời

8

Bạn đúng là c="c" (hoặc bất kỳ mệnh đề nào của biểu mẫu đó) được hiểu là đối số được cung cấp. Và không, không có cách nào để vô hiệu hóa điều đó - có lẽ nó được xử lý ở cấp độ của trình phân tích cú pháp R.

Sự khác biệt này giữa =<- được ghi chép lại ?"<-"

Các nhà khai thác ‘< -’ và ‘=’ gán vào môi trường trong đó họ được đánh giá. Toán tử '< -' có thể được sử dụng ở bất kỳ đâu, trong khi toán tử '=' chỉ được phép ở cấp cao nhất (ví dụ: trong biểu thức đầy đủ được nhập tại dấu nhắc lệnh) hoặc là của các biểu thức con trong danh sách biểu thức.

Ví dụ chính về "danh sách biểu thức được kết hợp" là một phần chức năng mà bạn có thể xác minh bằng cách nhập, ví dụ: is(body(plot.default)), length(body(plot.default)).

+0

Cảm ơn lời giải thích. Mỗi khi tôi gặp phải một cái gì đó như thế này tôi nghĩ rằng tôi tìm hiểu thêm một chút về cách trình phân tích cú pháp R hoạt động. Bây giờ nếu chỉ có tôi có một mùa hè miễn phí hoặc hai hoặc ba để đi lội qua nguồn C và tìm hiểu làm thế nào nó * thực sự * hoạt động :-) –

+0

@ AriB.Friedman - Hey, không cám dỗ tôi để có một cái nhìn cho bản thân mình! Tôi đã chỉ hạnh phúc để cuối cùng tìm ra những gì mà tham chiếu đến "braced subexpressions" đã thực sự nhận được tại, và sẽ đếm nó một thành tựu đã dừng lại ở đó;) –

+0

Kết hợp @MatthewPlourde 's gợi ý với bạn, 'là (quote ({5^2}) 'trả về' [1] "{" "ngôn ngữ" 'giống như' là (body (plot.default)) '. –

3

Josh đã trả lời "tại sao", nhưng theo gợi ý của OP, đây là một "làm thế nào":

within(list(a="a",b="b"), "="(c,"c")) 
# $a 
# [1] "a" 
# 
# $b 
# [1] "b" 
# 
# $c 
# [1] "c" 
Các vấn đề liên quan