This has essentially nothing to do with methods, but rather with the
treatment of missing arguments.
Consider:
> foo <- function(x,...)bar(x,...)
> bar <- function(x, y=12, z, ...) {cat(missing(y), "\n");
cat(y, "\n")}
This is the same argument-matching as your example, since the generic
and method have different formal arguments. And indeed,
> foo("a",,z=99)
TRUE
Error in cat(y, "\n") : argument is missing, with no default
The error message is correct, but the argument in question is not "y"
but "..1". This is constructed and passed down as a special R object
representing "missing-argument-with-no-default". (Splus would have
worked as you expected, because missingness there is a property of the
function call, not of the object corresponding to the formal argument.)
Herve Pages wrote:> Hi,
>
>
> Strange things happen with missing args in S4 methods:
>
> > setGeneric("mygen", signature="x", function(x,
...) standardGeneric("mygen"))
> [1] "mygen"
>
> > setMethod("mygen", "character", function(x,
y=12, z, ...) {cat(missing(y), "\n"); cat(y, "\n")})
> [1] "mygen"
>
> > mygen("aa", z=99)
> TRUE
> 12
>
> > mygen("aa", , 99)
> TRUE
> Error in cat(y, "\n") : argument is missing, with no default
> ^^^^^^^ ^^^^^^^^^^
> TRUE NOT TRUE!
>
>
> For "normal" functions, things work as expected:
>
> > myfun <- function(x, y=12, z, ...) {cat(missing(y),
"\n"); cat(y, "\n")}
>
> > myfun("aa", z=99)
> TRUE
> 12
>
> > myfun("aa", , 99)
> TRUE
> 12
>
> And with S3 generics too:
>
> > dd <- data.frame(aa=letters[1:9], ii=9:1)
> > head(dd, z="ignored")
> aa ii
> 1 a 9
> 2 b 8
> 3 c 7
> 4 d 6
> 5 e 5
> 6 f 4
>
> > head(dd, , "ignored")
> aa ii
> 1 a 9
> 2 b 8
> 3 c 7
> 4 d 6
> 5 e 5
> 6 f 4
>
> Cheers,
> H.
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>
>