2014-04-18 74 views
3

假設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

請提供可重複的例子 –

+3

我猜你正在尋找'?do.call'?像do.call(「f」,c(as.list(x),otherarguments = 100))' –

+0

@alexis_laz你應該轉換你的評論作爲答案:)比我的更好。 – agstudy

回答

2

這裏有一個選項:

我相信你有這個功能,你想 「矢量化」,X, y,z參數:

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

您可以在一個功能包裝它,用向量作爲參數爲其他SS參數(X,Y,Z)和「...」:

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

由於@agstudy如上所述,你實際上是尋找的是矢量化功能f(),而不是試圖載體傳遞給非VEC torized功能。在所有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

相關問題