2017-05-27 69 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