我认为你会更好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();返回的表达式的内部结构稍作改变,就会崩溃。这种结构没有记录,因此不能保证保持不变......