【发布时间】:2014-08-27 11:00:04
【问题描述】:
我正在尝试创建一个包含 iid Normal 数的矩阵列表。为了一个简单的例子,让矩阵为 4 x 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 新手,所以如果有经验的用户能解释这里发生了什么以及我的第一行失败的原因,我将非常感激。
【问题讨论】:
-
如果你不在函数中使用
x,lapply不知道如何处理1:3。 -
使用,....作为列表元素的名称。
-
@BondedDust - 如果您使用
sapply-sapply(letters[1:3], function(x) 10),则会出现名称,但对于lapply-lapply(letters[1:3], function(x) 10)则不能这样说 -
嗯,不是我所期望的。如果您将 sapply 与一组矩阵返回一起使用,它们会得到
rind()-ed。好的,...解释一下为什么sapply(1:3, function(x) {matrix(rnorm(8), 4, 2)})不返回一个有 12 行的矩阵? (我似乎过得很糟糕。) -
@BondedDust - 因为默认情况下
sapply将使用simplify2array将所有矩阵转换为向量然后绑定它们。您可以使用sapply(1:3, function(x) {matrix(rnorm(8), 4, 2)},simplify="array")从sapply中获得一个包含 12 行/2 列的数组,这是我刚刚发现的。