关于lapply的使用

时间:2015-10-16 05:09:58

标签: r for-loop lapply

有人发给我以下代码,它以列表格式重复相同的命令(mvrnorm)10次。

dat <- lapply(1:10,mvrnorm, n = 10, Sigma=matrix(.3, 3, 3), mu = rep(0, 3))

代码有效。

然而,当我尝试以下命令时,它不起作用,我不明白为什么它不起作用。我希望它可以重复计算'x'列数十次:

dat <- lapply(1:10, ncol, x=matrix(.3, 4, 4))

Error in FUN(X[[i]], ...) : unused argument (X[[i]])

基本上,我试图了解以下格式的工作原理:

lapply(1:10, function, ...)

如果有人可以向我解释为什么它在函数mvrnorm(第一个例子)但不是ncol(第二个例子)时有效?

2 个答案:

答案 0 :(得分:3)

  

基本上,我试图了解以下格式的工作原理:

     

lapply(1:10, fun, ...)

fun有多个参数的所有情况下。

让我们将lapply调用转换为等效的for循环:

X <- as.list(1:10) #elements to iterate over
res <- vector(mode = "list", length = length(X)) #pre-allocate results list
for (i in seq_along(X)) res[[i]] <- fun(X[[i]], ...)

现在,如果您使用多个参数调用单参数函数,则会收到错误消息。您还应该了解函数调用中的参数匹配是如何完成的。在您的示例lapply(1:10, ncol, x=matrix(.3, 4, 4))中,您可以混合使用名称匹配和位置匹配。由于名称匹配优先,因此将参数x传递给ncol,然后将1:10的元素用作第二个参数。这就是错误告诉您X[[i]]是未使用的参数的原因。

答案 1 :(得分:3)

如何在R中使用尽可能少的行重现该错误:

test = function(){    #method takes no parameters
    print("ok")
}
lapply(1:10, test)     #passing in 1 through 10 into test, 
                       #error happens here

引发错误:

Error in FUN(X[[i]], ...) : unused argument (X[[i]])
Calls: lapply -> FUN
Execution halted

方法&#39;测试&#39;没有参数,你用lapply传递了1个参数。

如何修复:

确保传递给sapply的函数使用相同数量的参数:

test = function(foobar){     #method takes one parameter
    print("ok")
}
lapply(1:10, test)           #passing in 1 through 10 into test,
                             #this runs correctly, printing ok 10 times.