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