如何从向量中指定函数的多个参数?

时间:2014-04-18 09:36:36

标签: r

假设f是一个可以接受不同数量参数的函数。我有一个向量x,其条目用作f的参数。

x=c(1,2,3) 
f(x[], otherarguments=100)

x的条目作为参数传递给f的正确而简单的方法是什么?谢谢!

E.g。

我想转换

t1 = traceplot(output.combined[1])
t2 = traceplot(output.combined[2])
t3 = traceplot(output.combined[3])
t4 = traceplot(output.combined[4])
grid.arrange(t1,t2,t3,t4,nrow = 2,ncol=2)

类似

tt=c()
for (i in 1:4){
tt[i] = traceplot(output.combined[i])
}
grid.arrange(tt[],nrow = 2,ncol=2)

2 个答案:

答案 0 :(得分:2)

这里有一个选项:

我假设你有这个功能,你想要“矢量化”,x,y,z参数:

ss <- 
function(x,y,z,t=1)
{
  x+y+z*t
}

你可以把它包装在一个函数中,vector用作(x,y,z)的参数,而'...'用于其他ss参数:

ss_vector <- 
  function(vec,...){
    ss(vec[1],vec[2],vec[3],...)
  }

现在你可以这样称呼它:

 ss_vector(1:3,t=2)
 [1] 9

相当于:

 ss(1,2,3,t=2)
 [1] 9

答案 1 :(得分:1)

正如上面提到的@agstudy所说,你实际需要的是对函数f()进行向量化,而不是试图将向量传递给非向量化函数。 R中的所有向量化函数都具有

形式
vectorized_f <- function(X) {
    x1 <- X[1]
    x2 <- X[2]
    x3 <- X[3]
    # ...
    xn <- X[length(X)]
    # Do stuff
}

举个例子,让我们f <- function(x1, x2, x3) x1 + x2 + x3。此函数未向量化,因此尝试传递向量需要解决方法。您可以按如下方式编写f(),而不是提供三个参数:

vectorized_f <- function(X) {
    x1 <- X[1]
    x2 <- X[2]
    x3 <- X[3]
    x1 + x2 + x3
}

当然你也可以尝试保持非矢量化,但正如我所说,这需要一个解决方法。这可以这样做:

f <- function(x1, x2, x3) x1 + x2 + x3
X <- c(1, 2, 3)
funcall_string <- paste("f(", paste(X, collapse = ","), ")", collapse = "")
# this looks like this: "f( 1,2,3 )"
eval(parse(text = funcall_string))
# [1] 6

但这实际上比矢量化版本慢。

system.time(for(i in 1:10000) {
    funcall_string <- paste("f(", paste(X, collapse = ","), ")", collapse = "")
    eval(parse(text = funcall_string))
})
   User      System verstrichen 
   2.80        0.01        2.85

Vs的

system.time(for(i in 1:10000) vectorized_f(X))
   User      System verstrichen 
   0.05        0.00        0.05

H个, d