使用"..."和"复制"

Nic*_*bbe 19 r ellipsis replicate sapply

在文档中sapply,replicate有关于使用的警告...

现在,我可以接受它,但想了解它背后的原因.所以我创造了这个小小的人为例子:

innerfunction<-function(x, extrapar1=0, extrapar2=extrapar1)
{
    cat("x:", x, ", xp1:", extrapar1, ", xp2:", extrapar2, "\n")
}

middlefunction<-function(x,...)
{
    innerfunction(x,...)
}

outerfunction<-function(x, ...)
{
    cat("Run middle function:\n")
    replicate(2, middlefunction(x,...))
    cat("Run inner function:\n")
    replicate(2, innerfunction(x,...))
}

outerfunction(1,2,3)
outerfunction(1,extrapar1=2,3)
outerfunction(1,extrapar1=2,extrapar2=3)
Run Code Online (Sandbox Code Playgroud)

也许我已经做了一些明显可怕的错误,但我发现这个结果令人不安.所以任何人都可以向我解释为什么在上面的所有调用中outerfunction,我得到了这个输出:

Run middle function:
x: 1 , xp1: 0 , xp2: 0 
x: 1 , xp1: 0 , xp2: 0 
Run inner function:
x: 1 , xp1: 0 , xp2: 0 
x: 1 , xp1: 0 , xp2: 0
Run Code Online (Sandbox Code Playgroud)

就像我说的那样:文档似乎对此警告,但我不明白为什么会这样.

Rei*_*son 12

?replicate在示例部分中,明确告诉我们您尝试做的事情不会也不会起作用.在我们的Note部分?replicate:

     If ‘expr’ is a function call, be aware of assumptions about where
     it is evaluated, and in particular what ‘...’ might refer to.  You
     can pass additional named arguments to a function call as
     additional named arguments to ‘replicate’: see ‘Examples’.
Run Code Online (Sandbox Code Playgroud)

如果我们看一下例子,我们会看到:

 ## use of replicate() with parameters:
 foo <- function(x=1, y=2) c(x,y)
 # does not work: bar <- function(n, ...) replicate(n, foo(...))
 bar <- function(n, x) replicate(n, foo(x=x))
 bar(5, x=3)
Run Code Online (Sandbox Code Playgroud)

我对这些文档的阅读是,他们所做的远不止警告你...replicate()电话中使用; 他们明确地说明它不起作用.该帮助文件中的大部分讨论都涉及其他功能的... 论点,而不一定是replicate().


Jam*_*mes 6

如果你看代码replicate:

> replicate
function (n, expr, simplify = TRUE) 
sapply(integer(n), eval.parent(substitute(function(...) expr)), 
    simplify = simplify)
<environment: namespace:base>
Run Code Online (Sandbox Code Playgroud)

您会看到在父框架中评估函数,其中...您的调用函数不再存在.