4

这是我刚刚遇到的一个难题:

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)
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 解析的心理模型,在这个模型中,一切都得到解决,然后存储或传递给下一个参数。我学会了不要忽视这样的时刻,因为重新构建我的心智模型以考虑新信息通常会导致对事物的更深入理解。

那么……这是怎么回事?

4

1 回答 1

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)
于 2012-08-07T18:47:33.530 回答