假设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)
答案 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