将几个参数传递给lapply(和其他* apply)的FUN


99

我在使用lapply中有一个关于将多个参数传递给函数的问题R

当我将lapply与-的语法一起使用时,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
}

如何通过传递两个input元素(作为x参数)和其他一些参数来使用此函数?


以“;”终止R控制台输入行 这表明您过去可能使用过某些宏处理语言。“ R简介”文档“编写自己的函数”部分的第4小节(可能是您应该阅读的第一个“手册”)的第4小节中介绍了三点参数。
IRTFM

Answers:


121

如果您查看帮助页面,则其中的参数之一lapply...。当查看帮助页面的“参数”部分时,会发现以下行:

...: optional arguments to ‘FUN’.

因此,您要做的就是在lapply调用中包含另一个参数作为参数,如下所示:

lapply(input, myfun, arg1=6)

并且lapply,如果认识到arg1不是自己知道该如何处理的参数,则会自动将其传递给myfun。所有其他apply功能都可以做同样的事情。

附录:您也可以...在编写自己的函数时使用。例如,假设您编写了一个plot在某个时刻调用的函数,并且希望能够从函数调用中更改绘图参数。您可以将每个参数作为参数包含在函数中,但这很烦人。相反,您可以使用...(既作为函数的参数,也可以作为对函数的调用的参数),并将函数无法识别的任何参数自动传递给plot


如果您的第二个arg(例如“ arg1”)是与“ input”列表匹配的列表怎么办?当我尝试lapply(input,myfun,arg1 = input2)时,其中input2是一个列表,看起来lapply一次传递了整个列表,而不是像'input'一样逐元素地传递。
艾伦(Alan)

10
我刚刚在另一篇有效的文章中找到了答案:mapply(myfun,df $ input,df $ input2)
艾伦(Alan


11

您可以通过以下方式进行操作:

 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


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

x是向量或列表,分别针对的每个元素调用myfunin 。lapply(x, myfun)x

选项1

如果您想使用全arg1在每个myfun呼叫(myfun(x[1], arg1)myfun(x[2], arg1)等),使用lapply(x, myfun, arg1)(如上所述)。

选项2

如果您想然而就像打电话myfun到的每一个元素arg1单独一起的元素xmyfun(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).
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.