2013-05-13 29 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" 

我不確定爲什麼這兩個不應該是等效的。由於...,似乎=版本被解釋爲名爲c的參數。有什麼辦法可以禁用這種行爲嗎?我試過了,爲什麼=和< - 在()中不等價?

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

但是也失敗了。

+1

出於同樣的原因,'system.time(X = RNORM(1e300))沒有按'沒有工作。 – 2013-05-13 18:43:38

+7

如果'='是傳遞給函數的表達式中的頂層函數調用,那麼'='被理解爲參數賦值。與內部(list(a =「a」,b =「b」),{c =「c」})' – 2013-05-13 18:43:40

+0

= =作爲一個賦值在函數內部很時髦,R會感到困惑無論它是一個賦值還是一個論點。 – 2013-05-13 18:46:46

回答

8

您正確地認爲c="c"(或該表單的任何子句)被解釋爲提供的參數。不,沒有辦法禁用它 - 它大概是在R解析器的級別處理的。

=<-之間的這種差異是記錄?"<-"

運算符「< - 」和「=」分配到其中 它們被評估的環境。 '運營商'< - '可以在任何地方使用, 而運營商'='只能在最高級別(例如,在命令提示符下鍵入的完整表達式中的 )或者作爲支撐列表中的子表達式的一個 的表達。

「支撐表達式列表」的主要示例是一個函數體,您可以通過鍵入來驗證,例如, is(body(plot.default))length(body(plot.default))

+0

感謝您的解釋。每當我遇到這樣的事情時,我想我會多瞭解一下R分析器的工作原理。現在,如果只有我有一個免費的夏季或者兩三次來通過C源代碼來弄清楚它是如何工作的:-) – 2013-05-13 19:17:25

+0

@ AriB.Friedman - 嘿,別誘惑我去看看爲了我自己!我很高興終於弄清楚那些提及「支撐子表達」的內容是否真的在那裏發揮作用,並且會指望它停止在那裏的成就;) – 2013-05-13 21:51:07

+0

將@MatthewPlourde的建議與你的結合起來,'is(quote({5^2})'returns'[1]「{」「language」'就像'is(body(plot.default))'一樣。 – 2013-05-14 00:12:50

3

喬希已經回答了 「爲什麼」,但在OP的建議,這裏是另一個 「如何」:

within(list(a="a",b="b"), "="(c,"c")) 
# $a 
# [1] "a" 
# 
# $b 
# [1] "b" 
# 
# $c 
# [1] "c" 
相關問題