0

海吉

我正在尝试访问 .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
>})

我该怎么做复制和粘贴很烦人,肯定不是故意的

谢谢你。

4

1 回答 1

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

于 2013-02-01T23:44:35.477 回答