Доступ к R производной.grad

Хей

Я пытаюсь получить доступ к.grad[, "x"] <- 2 * x из: (это пример, очевидно)

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
>})

как мне это сделать Это утомительно копировать и вставлять и, конечно, не предназначен

Спасибо.

1 ответ

Я думаю, тебе было бы лучше с 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(); эта структура не задокументирована, поэтому не гарантируется, что она останется прежней...

Другие вопросы по тегам