系统地将多变量函数转换为几个单变量函数

时间:2014-04-15 02:01:45

标签: r function

我们说我有两个参数的功能:

  

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个单变量函数?

1 个答案:

答案 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

您甚至可以为他们命名foo1foo2,...

for (ix in seq_along(foos)) assign(paste0('foo', ix), foos[[ix]], envir = environment())
foo1(5)
# [1] 49.70313