我们说我有两个参数的功能:
foo <- function(mu,sigma){ return(dnorm(x=0, mean=mu, sd=sqrt(sigma))) }
我可以把它变成两个单变量函数:
foo.mu <- function(mu) foo(mu,sigma=sigma.init)
foo.sigma <- function(sigma) foo(mu=mu.init, sigma)
这当然非常直截了当。但如果我有200个变量怎么办?例如,如果我有一个功能
foo2 <- function(mu){ ... }
现在mu
是一个长度的矢量,比方说200.有没有办法系统地浏览通过修复除一个坐标以外的所有坐标获得的所有200个单变量函数?
答案 0 :(得分:3)
我不确定你为什么要这样做,这可能不是正确的做法,但你要求的是:
# example 10-parameter mu
mu <- setNames(as.list(runif(10, 0, 1)), paste0('mu', seq_len(10)))
len <- length(mu)
# example 10-argument function
mufoo <- function() {}
body(mufoo) <- parse(text = paste(paste0("mu", seq_len(len)), collapse = " + "))
formals(mufoo) <- setNames(rep(list(formals(function(x){})[[1]]), len), paste0('mu', seq_len(len)))
print(mufoo)
# function (mu1, mu2, mu3, mu4, mu5, mu6, mu7, mu8, mu9, mu10)
# mu1 + mu2 + mu3 + mu4 + mu5 + mu6 + mu7 + mu8 + mu9 + mu10
foos <- lapply(seq_along(mu), function(ix) {
force(ix); force(mu)
function(submu) {
mu[[ix]] <- submu
do.call(mufoo, mu)
}
})
现在foos
是十个函数的列表,每个函数都是单变量的,并且正好控制mu
中的10个参数之一:
dput(as.numeric(mu))
# c(4.56169327721, 3.67214910686016, 3.32561796996742, 7.03987624496222,
# 4.30756138870493, 9.66635353863239, 4.04302914626896, 8.62502690404654,
# 1.0719409561716, 2.95157870510593)
foos[[5]](5)
# [1] 49.95727
foos[[6]](5)
# [1] 44.59847
您甚至可以为他们命名foo1
,foo2
,...
for (ix in seq_along(foos)) assign(paste0('foo', ix), foos[[ix]], envir = environment())
foo1(5)
# [1] 49.70313