Re: [问题] 自动改变function中的local variable

楼主: andrew43 (讨厌有好心推文后删文者)   2016-11-04 04:41:50
# 因为你的例子不会看到变化结果,所以我把方程式改一下。
# 为了未来潜在使用的灵活性,把 z 和 y 也写成参数 loc 了。
ff <- function(loc, a) {
rez <- (loc[1] ^ 2) * (loc[2] ^ a) + 3
return(rez)
}
# try ff()
ff(c(1, 2), a = 1)
ff(c(1, 2), a = 3)
# try grad() and hessian()
library(numDeriv)
grad(ff, c(1, 2), a = 1)
grad(ff, c(1, 2), a = 3)
hessian(ff, c(1, 2), a = 1)
hessian(ff, c(1, 2), a = 3)
# 这里 grad() 和 hessian() 的用法受益于作者提供的 "..." 参数,
# 所以本来给 ff() 的 a 可以直接丢入。
# 建立 a.seq 的 list,当成变动 a 的值与容器
a.seq <- as.list(seq(1, 3, 1))
# 利用 lapply 做 grad() 和 hessian()
res.list <-
lapply(a.seq, function(this.a) {
res.grad <- grad(ff, c(1, 2), a = this.a)
res.hessian <- hessian(ff, c(1, 2), a = this.a)
return(list(
res.grad = res.grad,
res.hessian = res.hessian,
a = this.a
))
})
res.list # 结果与上面试验相符
# 取出所有的 res.grad 或 res.hessian
# 用 lapply 或 sapply 看之后的使用情况而定
lapply(res.list, function(x) x$res.grad)
sapply(res.list, function(x) x$res.grad)
lapply(res.list, function(x) x$res.hessian)
sapply(res.list, function(x) x$res.hessian)
使用 list + l/sapply 系列的设计可能对之后的扩展更有利,例如平行运算。
for loop 当然也可以解,看个人撰写偏好。
※ 引述《TZULIU (消费券收购商)》之铭言:
: [问题类型]:
: 程式咨询(我想用R 做某件事情,但是我不知道要怎么用R 写出来)
: [软件熟悉度]:
: 使用者(已经有用R 做过不少作品)
: [问题叙述]:
: 想取(z^2)*(y^2)+a于z=1和y=2(在不同的a值下)的gradient与Hessian,
: 在下面范例中,请问有没有方法可以透过loop持续改变常数项3(e.g. 0到3)?
: [程式范例]:
: 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))
: 谢谢!
作者: TZULIU (消费券收购商)   2016-11-08 11:38:00
感谢你的帮忙!

Links booklink

Contact Us: admin [ a t ] ucptt.com