[英]How to pass arguments to function called from mapply directly OR how to treat vector as argument to function not to mapply
假設我有以下功能:
my.fun1 <- function(a,b,c){
a * c + b
}
如果我想使用多個參數多次調用它,可以執行以下操作:
> my.fun1(1, 1, c(1:3))
[1] 2 3 4
> my.fun1(2, 2, c(1:3))
[1] 4 6 8
> my.fun1(3, 3, c(1:3))
[1] 6 9 12
但是,如果我使用mapply
得到以下信息:
> mapply(my.fun1, c(1:3), c(1:3), c(1:3))
[1] 2 6 12
而不是期望的:
[[1]]
[1] 2 3 4
[[2]]
[1] 4 6 8
[[3]]
[1] 6 9 12
恕我直言,問題是mapply
基本上將函數調用轉換為:
> my.fun1(1, 1, 1)
[1] 2
>
> my.fun1(2, 2, 2)
[1] 6
>
> my.fun1(3, 3, 3)
[1] 12
如何將mapply
最后一個參數直接傳遞給my.fun1
而不被視為mapply
參數而是my.func1
呢?
PS:我一直在使用maplpy
調用中的匿名函數。 最接近的是get(基於此處的建議):
> x <- mapply(function(x, y){my.fun1(x, y, c(1:3))}, c(1:3), c(1:3))
> split(x, rep(1:ncol(x), each = nrow(x)))
$`1`
[1] 2 3 4
$`2`
[1] 4 6 8
$`3`
[1] 6 9 12
但是我認為這是丑陋的方法,必須有更好的方法。
由於my.fun1
的最后一個輸入是相同的vector
,我們將其放置在list
,並將其作為Map
或mapply
參數mapply
。
Map(my.fun1, 1:3, 1:3, list(1:3))
或者如@baptiste所述,可以使用MoreArgs
傳遞MoreArgs
Map(my.fun1, 1:3, 1:3, MoreArgs = list(c=1:3))
當我們使用mapply
,最好使SIMPLIFY=FALSE
以避免將list
強制轉換為matrix
(如果list
元素的長度相同)。
mapply(my.fun1, 1:3, 1:3, list(1:3), SIMPLIFY=FALSE)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.