R语言:lapply中带有函数参数的意外行为

时间:2014-07-07 03:03:37

标签: r list matrix lapply

我正在尝试创建一个包含iid Normal数字的矩阵列表。为了一个简单的例子,让矩阵为4乘2并考虑长度为3的列表。下面的代码似乎应该可以工作(对我来说):

MyMatrix <- lapply(1:3, function() {matrix(rnorm(8), 4, 2)})

但它失败了,出现以下错误:

Error in FUN(1:3[[1L]], ...) : unused argument (1:3[[1]])

一时兴起,我试过:

MyMatrix <- lapply(1:3, function(x) {matrix(rnorm(8), 4, 2)})

它有效!但为什么? x未在函数中的任何位置使用,并且在实验中,表达式的行为不受工作空间中是否已存在x的影响。这看起来完全是多余的。

我是R的新手,所以如果有经验的用户可以解释这里发生的事情以及我的第一行失败的原因,我将非常感激。

1 个答案:

答案 0 :(得分:4)

你不能拥有一个不接受参数然后传递参数的函数。这正是您在运行lapply时所做的事情,因为每个值依次作为函数的第一个参数传递。 E.g。

out <- lapply(1:3, function(x) x)
str(out)
#List of 3
# $ : int 1
# $ : int 2
# $ : int 3

抛出错误的简单示例:

test <- function() {"woot"}
test()
#[1] "woot"
test(1) 
#Error in test(1) : unused argument (1)
lapply(1:3, test)
#Error in FUN(1:3[[1L]], ...) : unused argument (1:3[[1]])

这是R错误输出的好形式,因为它可能意味着你期望函数的返回结果根据传递给函数的参数而改变。它不会。在基础R中包含这样的函数,如Sys.time(),如果你试图传递它可能有意义的多余参数,它们将会失败:

Sys.time()
#[1] "2014-07-07 13:22:11 EST"
Sys.time(tz="UTC")
#Error in Sys.time(tz = "UTC") : unused argument (tz = "UTC")