我认为你会更好D()
:
D(expression(x^2),"x")
## 2 * x
D()
记录在同一页面上deriv()
(即?D
,?deriv
将您带到同一页面)
显然,该~
快捷方式不适用于D
,尽管您可以使用quote()
而不是expression()
保存一些击键。
eval(D(quote(x^2), "x"),list(x=5))
## 10
从结果中提取梯度表达式deriv
更糟糕,因为这不是作者认为你会尝试做的事情。 .grad
不是最终结果的属性,它是函数内部使用的临时变量。在这种情况下,作者认为用户想要的是计算表达式时梯度的数值:
dd <- deriv(~ x^2,"x")
attr(eval(dd,list(x=5)),"gradient")
## x
## [1,] 10
您可以获得表达式,但只能通过在表达式主体中进行特定挖掘。dd[[1]]
是表达式的主体。dd[[1]][[4]]
是第四个子表达式:
dd[[1]][[4]]
## .grad[, "x"] <- 2 * x
然后我们可以提取右侧(表达式在内部以前缀表示法存储为{operator,LHS,RHS}
:
dd[[1]][[4]][[3]]
## 2 * x
但这似乎确实是一条艰难的道路,而且如果 R 作者对deriv()
;返回的表达式的内部结构稍作改变,就会崩溃。这种结构没有记录,因此不能保证保持不变......