有人发给我以下代码,它以列表格式重复相同的命令(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
(第二个例子)时有效?
答案 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.