jason at cs.jhu.edu writes:
> I am using R version 2.0.0 (2004-10-04) on Fedora Core 2.
>
> This works correctly:
>
> > foo <- function(x=1,y=2) { c(x,y) }
> > bar <- function(n,...) c(n,foo(...))
> > bar(10,3)
> [1] 10 3 2
>
> But it goes wrong if I replace "c" in bar with
"replicate":
>
> > foo <- function(x=1,y=2) { c(x,y) }
> > bar <- function(n,...) replicate(n,foo(...))
> > bar(10,3)
> [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
> [1,] 0 0 0 0 0 0 0 0 0 0
> [2,] 2 2 2 2 2 2 2 2 2 2
>
> It is mysterious why x was bound to the apparently arbitrary
> value 0 while y was left at its default.
>
> The ... arguments to bar seems to be ignored altogether.
> bar(10), bar(10,x=3), and bar(10,3,4) give the same result.
> Furthermore, bar(10,extra=3) does not give an error.
>
> Perhaps this mysterious behavior is unavoidable because of
> the kind of hack replicate is?
Yes. It is really a wrapper for
sapply(integer(n), eval.parent(substitute(function(...) expr))
Now, integer(n) is n zeroes, and the function that is passed to sapply
is
Browse[1]> FUN
function (...)
foo(...)
<environment: 0xd82338>
Now, this gets called as FUN(0) and in turn foo(0) which is c(0,2).
So, the short answer is "don't do that", and the long answer is
"don't
do that". If you're adventurous, you could try experimenting with a
different definition, possibly
sapply(integer(n), eval.parent(substitute(function(...) eval.parent(expr)))
but I'm far from sure that it works...
--
O__ ---- Peter Dalgaard ?ster Farimagsgade 5, Entr.B
c/ /'_ --- Dept. of Biostatistics PO Box 2099, 1014 Cph. K
(*) \(*) -- University of Copenhagen Denmark Ph: (+45) 35327918
~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk) FAX: (+45) 35327907