如何自动更改R中函数内的局部变量?

时间:2016-11-03 09:24:26

标签: r

为简化问题,我将在此处使用玩具示例。我想导出多项式函数的梯度和Hessian,如     库(pracma)

dummy <- function(x) {
         z <- x[1]; y <- x[2]
         rez <- (z^2)*(y^3)+3
         rez
         }
grad(dummy, c(1,2))

hessian(dummy, c(1,2))

M问题是有没有一种有效的方法,所以我可以从dummy中的不同常数项推导出渐变和Hessian?例如,来自(z^2)*(y^3)+a z=1y=2的{​​{1}}的渐变和Hessians,其中a=[0.01,3]

谢谢!

1 个答案:

答案 0 :(得分:3)

pracma::hessianpracma::grad都将...作为&#34;变量传递给f&#34;。如果您希望a成为变量,您只需要将dummy函数作为参数:

dummy <- function(x, a) {
         z <- x[1]; y <- x[2]
         rez <- (z^2)*(y^3)+a
         rez
         }

grad(dummy, c(1,2), a = 0.01)
# [1] 16 12
hessian(dummy, c(1,2), a = 3)
#      [,1] [,2]
# [1,]   16   24
# [2,]   24   12

sapply(seq(0.01, 3, length.out = 10), function(a) grad(dummy, c(1, 2), a = a))
#      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,]   16   16   16   16   16   16   16   16   16    16
# [2,]   12   12   12   12   12   12   12   12   12    12

当然结果都是一样的,你改变一个常数,然后取衍生物;任何常数的导数都是0.但是这个想法会推广到更有趣的案例。