使用多个参数的R apply函数

171

我有一个在R语言中的函数 f(var1, var2)。假设我们设置 var2 = 1,现在我想将函数 f() 应用于列表 L。我的目标是获取一个新的列表 L*,其中包含输出结果。

[f(L[1],1),f(L[2],1),...,f(L[n],1)]

如何使用applymapplylapply来完成这个任务?


类似问题:https://dev59.com/1XE85IYBdhLWcg3w64EA#28102021 - Scott C Wilson
3个回答

233

只需将var2作为额外参数传递给apply函数之一。

mylist <- list(a=1,b=2,c=3)
myfxn <- function(var1,var2){
  var1*var2
}
var2 <- 2

sapply(mylist,myfxn,var2=var2)

这会将相同的var2传递给myfxn的每个调用。如果您希望每次调用myfxn都获取mylistvar2的第1/2/3等元素,则需要使用mapply函数。


5
但请注意,myfxn 可能是矢量化的,如果是这样,就应该使用 myfxn(unlist(mylist), var2=var2) - baptiste
原始示例不太清楚,但似乎没有进行向量化。不过,这个观点很有道理。 - Ari B. Friedman
有没有一种方法可以使它作为“即兴函数”工作?类似这样: sapply(mylist, function(var1, var2) { var1*var2 }, var=thisvar2) 但是,我收到一个错误,表示参数 2 匹配多个形式参数。 - emudrak
1
@emudrak,我认为问题在于你给传递的参数命名为var而不是var2。R无法理解你的意思。 - Ari B. Friedman

82
如果你的函数有两个向量变量,并且必须对它们的每个值进行计算(如@Ari B. Friedman所提到的),你可以使用mapply,方法如下:

如果您的函数需要两个向量变量,并且必须对每个值进行计算(正如@Ari B. Friedman所提到的),则可以按以下方式使用mapply

vars1 <- c(1, 2, 3)
vars2 <- c(10, 20, 30)
mult_one <- function(var1, var2)
{
   var1*var2
}
mapply(mult_one, vars1, vars2)

这将给你:

> mapply(mult_one, vars1, vars2)
[1] 10 40 90

6
感谢您的赞同,对于用一个简单明了的例子进行概括表示赞赏。 - JASC
2
如果vars1只有一个元素,mapply也会进行循环。例如,当vars1 <- 3时,mapply(mult_one, vars1, vars2)返回30 60 90。当您想要在函数的第二个参数上使用lapply时,这非常有用。 - Paul Rougieux
1
mapply函数是否支持在调用时传入超过两个参数的函数? - Julien

14
为了进一步概括 @Alexander 的例子,outer 在函数必须在每个向量值对上计算自身的情况下是相关的:

vars1 <- c(1,2,3)
vars2 <- c(10,20,30)
mult_one <- function(var1, var2)
{
   var1*var2
}
outer(vars1, vars2, mult_one)

提供:

> outer(vars1, vars2, mult_one)
     [,1] [,2] [,3]
[1,]   10   20   30
[2,]   20   40   60
[3,]   30   60   90

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接