将几个参数传递给lapply的乐趣(以及其他*适用)

时间:2013-01-20 17:38:42

标签: r lapply

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参数)和其他一些参数?

4 个答案:

答案 0 :(得分:92)

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

...: optional arguments to ‘FUN’.

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

lapply(input, myfun, arg1=6)

lapply,认识到arg1不是它知道如何处理的参数,会自动将其传递给myfun。所有其他apply函数都可以执行相同的操作。

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

答案 1 :(得分:14)

正如Alan所建议的,函数'mapply'将函数应用于多个多个列表或向量参数:

var button_clicked = false;
$('#button_create_product').click( function() {
    if (button_clicked) {
        $('.dialog_create_product').dialog('open');
    }
});
$( ".dialog_create_product" ).dialog({
    autoOpen: false,
    width: 800,
    buttons: {
        OK: function() {
            $(".dialog_create_product").dialog("close")

        },
        CANSEL: function() {
            $(".dialog_create_product").dialog("close")
        }
    },
});
$("#btn3").click(function() {
    $('#menu').load("products.jsp",function () {
        button_clicked = true;
    });
});

参见手册页: https://stat.ethz.ch/R-manual/R-devel/library/base/html/mapply.html

答案 2 :(得分:7)

您可以通过以下方式完成此操作:

 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 :(得分:1)

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

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

选项1

如果您想在每个arg1调用中使用整个myfunmyfun(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).