[Rd] unexpected behavior of callNextMethod() when passing arguments in methods to generic function

henrik at singmann.org henrik at singmann.org
Tue Aug 30 12:35:41 CEST 2011

there seems to be an unexpected behavior when using callNextMethod() in a method
to a (user defined) generic function so that additional arguments to the ones
defined in the signature of the generic are not passed correctly (i.e., their
value are lost/replaced by the default).
Problem description:
We have two hierarchical classes, "foo" and subclass "bar" and a generic
function "foobar". There exists methods for foobar for both "foo" and "bar" that
have the same signature, which differs from the signature in the generic
function (i.e., there are additional arguments in the methods).There are default
values for the additional arguments in the two methods.The method for "bar"
contains a callNextMethod() statement.
Now calling "foobar" for an object of class "bar" with an additional argument
set to a non-defualt value leads to: in the method for "bar", the the additional
argument is equal to the input; in the method for "foo" (i.e., within the
callNextMethod() statement) the additional argument is equal to the default for
that method (i.e., instead of equal to the user input).
This behavior contrasts with my reading of ?callNextMethod which states:
For a formal argument, sayx, that appears in the original call, there is a
corresponding argument in the next method call equivalent tox = x. In effect,
this means that the next method sees the same actual arguments, but arguments
are evaluated only once.
Therefore I would expect the additional argument be passed on by
callNextMethod() as inputted by the user. 

setClass("foo", representation(x = "numeric"))
setClass("bar", contains = "foo")

setGeneric("foobar", function(object, ...) standardGeneric("foobar"))

setMethod("foobar", "foo", function(object, another.argument = FALSE, ...) {
    print(paste("another.argument in foo-method:", another.argument))
    object at x

setMethod("foobar", "bar", function(object, another.argument = FALSE, ...) {
    print(paste("another.argument in bar-method:", another.argument))

o1 <- new("bar", x = 4)

> foobar(o1, another.argument = TRUE)
[1] "another.argument in bar-method: TRUE"
[1] "another.argument in foo-method: FALSE"
[1] 4

Related Issues:
I already asked this question on stackoverflow
(http://stackoverflow.com/q/7190697/289572) and got a helpful answer with
workarounds from Martin Morgan. However, I have the feeling that this may be of
interest here, too. 
This problem may or may not be related to the following similar bug reported on
> sessionInfo()
R version 2.13.1 (2011-07-08)
Platform: i386-pc-mingw32/i386 (32-bit)

[1] LC_COLLATE=English_United Kingdom.1252  LC_CTYPE=English_United
Kingdom.1252    LC_MONETARY=English_United Kingdom.1252
[4] LC_NUMERIC=C                            LC_TIME=English_United

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base    

other attached packages:
[1] fortunes_1.4-2

More information about the R-devel mailing list