在函数的定义中来自`...`的意外行为

时间:2017-02-06 12:37:07

标签: r wrapper

NB:此问题How to use R's ellipsis feature when writing your own function?的副本。那个问题询问如何使用省略号,特别是"如何[1]将省略号从函数的签名转换为例如列表?"下面我不会问任何类似的事情。我在问为什么我使用省略号无法产生预期的结果。

例如,下面的函数my.ls旨在成为base::ls的包装,使all.names = TRUE成为默认值:

my.ls <- function (...) base::ls(..., all.names = TRUE)

我曾预料到,根据此定义,my.ls()会产生与base::ls(all.names = TRUE)相同的值。令我惊讶的是,这两个表达式的值甚至都不接近。

例如:

% /usr/bin/R --quiet --vanilla
> x <- 3; .y <- 1; z <- 4
> base::ls(all.names = TRUE)
[1] "x"  ".y" "z" 
> my.ls <- function (...) base::ls(..., all.names = TRUE)
> my.ls()
[1] "..."

我做错了什么?

2 个答案:

答案 0 :(得分:1)

是因为envirbase::ls的默认参数是as.environement(pos)吗?

假设您在全球环境中工作,添加envir = gloal.env()似乎对我有用。

答案 1 :(得分:1)

好的,我发现了问题。 my.ls的以下实现更接近我所追求的目标:

my.ls <- function (name, all.names = TRUE, ...) {
    if (missing(name))
        return(my.ls(parent.frame(1), all.names = all.names, ...))

    base::ls(name, all.names = all.names, ...)
}