【发布时间】:2017-12-14 04:05:56
【问题描述】:
我有一个名为vec 的Vectorized 函数(如下)。我的目标是能够获得一个可子集列表作为此函数的输出。也就是说,当我运行该函数时,我将能够将函数调用保存为一个对象(例如,I),然后使用来自I 的$ 子集所需的输出,在这种情况下像这样(首次运行函数vec如下):
I = vec(L = .3, U = .6, level = seq(.5, .95, .1)) ; I$alpha ; I$beta
如果使用Vectorize,这可能吗? (非常感谢您的专业知识)
这里是 R 函数:
vec = Vectorize(function(L, U, level = .95){
p1 = (1 - level)/2
p2 = 1 - p1
f.beta <- function(alpha, beta, x, lower = 0, upper = 1){
p <- pbeta((x-lower)/(upper-lower), alpha, beta)
log(p/(1-p)) }
delta <- function(fit, actual) sum((fit-actual)^2)
objective <- function(theta, x, prob, ...) {
ab <- exp(theta)
fit <- f.beta(ab[1], ab[2], x, ...)
return (delta(fit, prob)) }
x.p <- (function(p) log(p/(1-p)))(c(p1, p2))
sol <- nlm(objective, log(c(1e1, 1e1)), x = c(L, U), prob = x.p, lower = 0, upper = 1, typsize = c(1, 1), fscale = 1e-12, gradtol = 1e-12)
parm <- as.numeric(exp(sol$estimate))
list(alpha = parm[[1]], beta = parm[[2]])
}, c("L", "U", "level"), SIMPLIFY = FALSE)
【问题讨论】:
-
是你想要循环的
level,即lapply( seq(.5, .95, .1), vec, L = .3, U = .6) -
如果我查看代码,只有
level的长度大于 1 -
长度大于1时是相同的还是不同的。也许你需要
expand.grid(L, U, level) -
那么,在这种情况下,如果我使用
expand.grid正确,您可能需要获取所有组合? -
基于函数,你已经得到了一个输出,但唯一的问题是它在
list所以,sapply(I, '[[', 'alpha')# [1] 2.371449 3.562465 5.278213 7.939884 12.918233和类似的'beta',即sapply(I, '[[', 'beta')# [1] 2.863406 4.336959 6.461091 9.757192 15.922938我猜是你问的,对吧?
标签: r function output vectorization