2013-10-17 55 views
7

我有下面的代碼:如何將表達式的變量傳遞給curve()作爲其方程?

e <- expression(x^2+3*x-3) 

我想畫的一階導數,使用R的符號衍生功能d情節:

curve(D(e), from=0, to=10) 

但後來我得到以下錯誤:

Error in curve(expression(e), xname = "x", from = 0, to = 3000) : 
    'expr' must be a function, or a call or an expression containing 'x' 

我試圖在eval()調用中包裝D(e),但無濟於事。

嘗試多一點:

substitute(expression(x^2+3*x-3), list(x=3)) 

結果,一如預期,在:

expression(3^2+3*3-3) 

但是:

substitute(e, list(x=3)) 

結果:

e 

發生了什麼事?我怎樣才能得到這個工作?

回答

5

這是一個有點麻煩,但是

eval(substitute(curve(y),list(y=D(e,"x")))) 

似乎工作。所以確實

do.call(curve,list(D(e,"x"))) 
+1

或者,等價地,'的eval(呼叫( 「曲線」,d(E, 「X」),選自= O,以= 1)',它使用的語法可能更容易解析(?) –

+0

Aha,現在我更好地理解替換和表達式的行爲,並且我最喜歡@Ben Bolker的第一個解決方案,因爲在這種形式中它更容易至少在概念上寫作:'eval(替代(曲線(y,from = 0,to = 10),list(y = D(e,「x」))))' – Nanitous

+0

@Ben Bolker:對於一個可行的解決方案感到滿意,但我仍然不太瞭解它。'curve()'發出一條錯誤消息明確地說,第一個參數必須是一個表達式,而「e」是一個包含表達式的變量,其中包含一個「x」。 R如何看到包含表達式的變量?在我看來,R以某種方式傳遞了不同的參數。 – Nanitous

3

功能是簡單的操縱和測試:

e <- expression(x^2+3*x-3) 
de <- D(e, 'x') 
fde <- function(x) eval(de) 

curve(fde, from=0, to=10) 
相關問題