2017-05-27 49 views
2

我是編碼和R的全新人物,我試圖教自己,但我掙扎了一下。R用戶定義函數中的衍生物和表達式

我正在嘗試創建一個簡單的微積分函數,它將使del運算符∇=作用於標量。我可以手動計算衍生產品:

> c(D(expression(x*y*z),'x'),D(expression(x*y*z),'y'), 
D(expression(x*y*z),'z')) 
[[1]] 
y * z 

[[2]] 
x * z 

[[3]] 
x * y 

這是我到目前爲止,它顯然需要更多的輸入。任何人可以幫助我,將不勝感激:)

> grad <- function(scal) { 
+ c(D(expression(scal),'x'),D(expression(scal),'y'), 
    D(expression(scal),'z')) 
+ } 

> grad(x*y*z) 
[1] 0 0 0 
+0

也許'deriv'更好:'deriv(〜x * y * z,c('x','y','z'))'計算所有的部分偏差 – user2957945

回答

1

讓我們試試這個:

grad <- function(scal){ 
    scal <- substitute(scal) 
    sapply(c('x', 'y', 'z'), function(v) D(scal, v)) 
} 

# > grad(x*y*z) 
# $x 
# y * z 
# 
# $y 
# x * z 
# 
# $z 
# x * y 

注意:如果我們將sapply替換爲lapply,則輸出將與您的問題中的輸出完全一致。但我認爲names的結果更具信息性。

+0

這是非常好的,完美的作品! – nkwm

0

你應該傳遞給grad的表達式:

grad <- function(scal) { 
    c(D(scal,'x'), D(scal,'y'), D(scal,'z')) 
} 
grad(expression(x*y*z)) 

通過grad給出的輸出是list有3個要素:

[[1]] 
y * z 

[[2]] 
x * z 

[[3]] 
x * y