HeJ小鼠
我正试图访问.grad [,“x”]< - 2 * x from :(显然这是一个例子)
deriv(~ x^2,"x")
>expression({
>.value <- x^2
>.grad <- array(0, c(length(.value), 1L), list(NULL, c("x")))
>.grad[, "x"] <- 2 * x
>attr(.value, "gradient") <- .grad
>.value
>})
我该怎么做复制和粘贴很麻烦,而且肯定没有意图
谢谢。
答案 0 :(得分:2)
我认为你最好用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()
返回的表达式的内部结构稍作改动,那么将会破坏;这种结构没有记录,因此不保证保持不变......