这是我刚遇到的一个谜题:
x <- data.frame(a="hi",b="lo")
y <- data.frame(a="hi",b="lo")
getCommonNames <- function(...) {
l <- list(...)
sapply( l, names )
}
VS
getCommonNames2 <- function(...) {
sapply( list(...), names )
}
> getCommonNames2(x,y)
Error in lapply(X = X, FUN = FUN, ...) :
argument "X" is missing, with no default
> getCommonNames(x,y)
[,1] [,2]
[1,] "a" "a"
[2,] "b" "b"
为什么list(...)
在存储到某个东西时(或用作返回值)将其内容正确地强制转换为列表,但是在没有先存储它的情况下在表达式中使用它时呢?
这似乎是一种琐碎的事情,但它有点破坏了我的R解析的心理模型,其中一切都得到解决然后存储或传递到下一个参数。我已经学会了不要忽视这些时刻,因为重新构建我的心理模型以考虑新信息通常会导致对事物的更深入理解。
那么......这里发生了什么?
答案 0 :(得分:1)
这可能是您的R版本中的错误或当前环境中的某些不匹配。
我的版本没有重现同样的问题,只是按预期进行。
> x <- data.frame(a="hi",b="lo")
> y <- data.frame(a="hi",b="lo")
>
> getCommonNames <- function(...) {
+ l <- list(...)
+ sapply( l, names )
+ }
>
>
> getCommonNames2 <- function(...) {
+ sapply( list(...), names )
+ }
>
> getCommonNames2(x,y)
[,1] [,2]
[1,] "a" "a"
[2,] "b" "b"
> getCommonNames(x,y)
[,1] [,2]
[1,] "a" "a"
[2,] "b" "b"
version.string R version 2.14.0 (2011-10-31)