【问题标题】:R language: Unexpected behaviour with function arguments in lapplyR语言:lapply中函数参数的意外行为
【发布时间】: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 新手,所以如果有经验的用户能解释这里发生了什么以及我的第一行失败的原因,我将非常感激。

【问题讨论】:

  • 如果你不在函数中使用xlapply 不知道如何处理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 列的数组,这是我刚刚发现的。

标签: r list matrix lapply


【解决方案1】:

你不能有一个不接受参数然后传递参数的函数。这正是您在运行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")

【讨论】:

  • 你的意思是 1:3 的元素(在我的问题中)作为第一个参数自动传递给函数(所以如果不指定参数,我会收到错误)?
  • 太棒了,谢谢!从文档中我并不清楚(我可能很迟钝),但这是有道理的。您介意将这一点添加到您的答案中,因为那是困扰我的一点吗?还有+1+Tick
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-20
  • 2014-10-10
  • 1970-01-01
相关资源
最近更新 更多