向lapply(和其他* apply)的FUN传递多个参数

149

关于在使用Rlapply函数时传递多个参数的问题,我有一个疑问。

当我使用lapply(input, myfun)这种语法时,很容易理解,我可以像这样定义myfun:

myfun <- function(x) {
 # doing something here with x
}

lapply(input, myfun);

input的元素被作为x参数传递给myfun

但是如果我需要向myfunc传递更多参数呢?例如,它定义如下:

myfun <- function(x, arg1) {
 # doing something here with x and arg1
}

如何在传递两个元素(作为'x'参数)和其他一些参数的情况下使用此函数?


1
在R控制台中用“;”终止输入行,这是你过去可能使用某些宏处理语言的迹象。三个点的参数在“编写自己的函数”一节的子章节4中有描述,该文档是你应该阅读的第一份“手册”。 - IRTFM
4个回答

166

如果您查阅帮助页面,lapply 函数的其中一个参数是神秘的 ...。当我们查看帮助页面的 Arguments 部分时,会发现以下这行:

...: optional arguments to ‘FUN’.

所以你需要做的就是将另一个参数作为参数包含在lapply调用中,像这样:

因此,您只需将其他参数作为参数包含在lapply调用中即可。

lapply(input, myfun, arg1=6)

lapply会自动将它不认识的arg1参数传递给myfun,其他所有apply函数也可以做到这一点。

附加说明:你也可以在编写自己的函数时使用...。例如,假设你编写了一个函数,在某个时刻调用了plot,并且你想能够从函数调用中更改绘图参数。你可以将每个参数包含为函数的一个参数,但那很麻烦。相反,你可以使用...(作为你的函数和其中的plot调用的参数),并使任何你的函数没有识别出来的参数被自动传递给plot


如果您的第二个参数,例如“arg1”,是与“input”列表匹配的列表呢?当我尝试使用_lapply(input, myfun, arg1=input2)_其中input2是一个列表时,看起来lapply会一次性传递整个列表,而不是像'input'一样逐个元素传递。 - Alan
12
我刚在另一篇帖子中找到了一个可行的答案:mapply(myfun,df $ input,df $ input2) - Alan

27

值得一提的是,outer 也是同样的道理,它将一个函数应用于两个向量参数中每对值。手册链接:https://stat.ethz.ch/R-manual/R-devel/library/base/html/outer.html - Martin Smith

15

您可以按照以下方式进行:

 myfxn <- function(var1,var2,var3){
      var1*var2*var3

    }

    lapply(1:3,myfxn,var2=2,var3=100)

你将会得到答案:

[[1]] [1] 200

[[2]] [1] 400

[[3]] [1] 600


8
myfun <- function(x, arg1) {
 # doing something here with x and arg1
}

x是一个向量或者列表,lapply(x, myfun)会分别针对x中的每一个元素调用myfun

选项1

如果你想在每个myfun调用中使用整个arg1(例如myfun(x[1], arg1)myfun(x[2], arg1)等),请使用lapply(x, myfun, arg1)(如上所述)。

选项2

如果你想把myfun分别应用到arg1的每个元素和x的每个元素上(例如myfun(x[1], arg1[1])myfun(x[2], arg1[2])等),则无法使用lapply。相反,请使用mapply(myfun, x, arg1)(如上所述)或apply

 apply(cbind(x,arg1), 1, myfun)

或者

 apply(rbind(x,arg1), 2, myfun).

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