2015-11-19 117 views
2

爲什麼以下工作:傳遞一個匿名函數作爲參數

foo <- function(x) {x} 
curve(foo) 
# plots the identity function between 0 and 1 

這並不:

curve(function(x) {x}) 

誤差曲線(函數(X){: 'expr的'沒有評估長度爲'n'的物體

而且還有

# the anonymous function can be called 
foo(1) #1 
(function(x) x)(1) #1 


all.equal(foo, function(x) {x}) 
# TRUE 

我嘗試過不同結果的「quote()」和「expression()」的各種組合。

+2

from'?curve':expr:函數的名稱或調用或表達式作爲X。所以'曲線({x})'例如。你只需要刪除'function(x)'。您也可以刪除括號。 – etienne

+0

哦,我已經閱讀了幫助文檔,但它讓我嘗試了'curve(x)'和'curve(quote(x))'這兩個都失敗了...... –

+0

因爲'x'本身不是一個函數,所以需要括號,但你可以使用'curve(sin(x))'或'curve({sin(x)})'來說明我關於刪除括號的意見。 – etienne

回答

2

?curve指出expr(第一個參數)應該是一個函數的名稱,一個調用或一個表達式作爲x的函數寫入,它將計算與x相同長度的對象。

因此,curve({x})將產生預期的結果。

至於爲什麼curve(function(x){x})返回錯誤,讀取curve的代碼將有所幫助。在函數定義的結束,我們有:

y <- eval(expr, envir = ll, enclos = parent.frame()) 
    if (length(y) != length(x)) 
     stop("'expr' did not evaluate to an object of length 'n'") 

,我們有:

eval(function(x){x}) 
# function(x){x} 

x在功能代碼定義爲seq.int(0, 1, length.out = 101)

因此,我們有錯誤作爲eval長度爲1,這不是我們想要的。

3

實際上curve的幫助頁確實是而不是說'expr'參數可以是一個函數對象。這三種可接受的參數是「名稱函數,或者調用或表達式作爲x的函數寫入,它將評估爲與x長度相同的對象。」 (着重號後加。)

以下所有成功的:

curve((function(x) {x})(x)) 
curve(local(x) ) 
curve(eval(x) ) 

當你看到...

all.equal(foo, function(x) {x}) 
# TRUE 

......有人說,語言對象連接到名稱foofunction(x) {x}相同。 (all.equal.language函數將對象或對象名稱解析爲字符結果並進行比較。)

相關問題