簡體   English   中英

如何將參數直接傳遞給從mapply調用的函數,或者如何將vector視為函數的參數而不是mapply

[英]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 ,並將其作為Mapmapply參數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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM