我正在尝试创建一个包含独立同分布正态数的矩阵列表。举个简单的例子,让矩阵为 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 的新手,所以如果有经验的用户能解释这里发生了什么以及为什么我的第一行失败,我将不胜感激。
最佳答案
你不能有一个不接受参数然后将参数传递给它的函数。这正是您在运行 lapply
时所做的,因为每个值都作为第一个参数依次传递给该函数。例如
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")
关于R语言: Unexpected behaviour with function arguments in lapply,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24602509/