2012-08-30 62 views
0

我在R中有一個函數需要3個參數,比如foo(x,y,z)R將mapply和sapply組合起來

當我調用函數時,我確實有一個x的元素列表,以及一個y的列表,但z只有一個元素。如果Z是一個列表,並且我想將foo應用於每個元素,那麼mapply(foo, x, y, z)的作品。

但是,由於z不是列表,因此mapply(foo,x,y,z)不起作用。

更具體地說,如果x和y是每個都有3個元素的列表,則下列方法可行:mapply(foo, x, y, list(z, z, z))

有沒有一種方法,我可以結合mapplysapply沒有我首先使z成爲3個元素列表?我想z只是被重用!

編輯1:有人問我的一個例子:

mylist1 <- list(c(5,4), c(7,9), c(8,3)) 
mylist2<- list(c(2,3), c(6,7), c(10,11)) 
item3 <- matrix(data = 15, nrow = 3, ncol = 3) 
foo <- function(x,y,z){ 
     return(x[1]+y[2]+z[2,2]) 
} 

以下工作:

> mapply(foo, mylist1, mylist2, list(item3,item3, item3)) 
[1] 23 29 34 

下不起作用:

mapply(foo, mylist1, mylist2, item3) 
Error in z[2, 2] : incorrect number of dimensions 
+1

我不認爲我跟隨。 '?mapply'上的文檔聲明參數通過循環擴展。你能構建一個能夠說明你的問題的具體例子嗎? – joran

回答

4

使用MoreArgs參數mapply

mapply(foo, x = mylist1, y= mylist2, MoreArgs = list(z = item3)) 
## [1] 23 29 34 
+0

這與我提出的建議基本相同(但輸入的更多)。 – joran

+0

是的,但是我不確定它是否相同,你的解決方案是否將'list(item3)'評估爲MoreArgs參數,或者作爲'...'的一部分?有關係嗎?無論如何,我認爲爲可讀性命名參數是一種好的做法。我非常樂意將我的答案作爲編輯添加到你的作品中,如果他們正在評估相同的東西 – mnel

+0

哦,我沒有抱怨!我非常確定,如果你不給'list(item3)命名',它會被'...'評估,但我不知道是否有通過回收強制向量化的性能成本。事實上,我不確定R如何在內部處理MoreArgs片斷。 – joran

2

你只要把最後一個項目放在一個列表中,R將會很好地回收它:

mapply(foo, mylist1, mylist2, list(item3)) 

注意的是,文件明確說,你傳遞參數必須是:

參數矢量化了(向量或嚴格正長度的列表,或所有長度爲零)

你試圖傳遞一個矩陣。