[Rd] bug in callNextMethod (PR#14185)
John Chambers
jmc at r-project.org
Thu Jan 14 01:09:30 CET 2010
Yes, a bug prevented callNextMethod() from detecting the special case of
the `[` call, for which it did have code.
Should be fixed in the current 2.11.0 (r 50976).
Thanks for the helpful bug report.
John Chambers
bernd_bischl at gmx.net wrote:
> Hi,
>
> there seems to be a possible bug in callNextMethod in conjunction with
> the [-operator.
>
> Relevant info, minimal example and sessionInfo follow below:
>
> ###############################
>
> setClass("foo", representation = representation(a = "numeric"))
> setClass("bar", contains = "foo")
>
> setMethod(
> f = "[",
> signature = signature("foo"),
> def = function(x,i,j,...,drop=TRUE) {
> cat("drop in foo-[ :", drop, "\n")
> return(1)
> }
> )
>
> setMethod(
> f = "[",
> signature = signature("bar"),
> def = function(x,i,j,...,drop=TRUE) {
> cat("drop in bar-[ :", drop, "\n")
> # we lose the value of drop here, when the call gets
> dispatched to the super method by callNextMethod
> callNextMethod()
> }
> )
>
> x <- new("foo")
> x[1, drop=FALSE]
> # drop in foo-[ : FALSE
> y <- new("bar")
> y[1, drop=FALSE]
> # drop in bar-[ : FALSE
> # drop in foo-[ : TRUE
>
> ###############################
>
> #?callNextMethod
> #The statement that the method is called with the current arguments is
> more precisely as follows. Arguments that were missing in the current
> call are still missing (remember that "missing" is a valid class in a
> method signature). For a formal argument, say x, that appears in the
> original call, there is a corresponding argument in the next method call
> equivalent to x = x. In effect, this means that the next method sees the
> same actual arguments, but arguments are evaluated only once.
>
> ###############################
>
>
> #S3 gets this right:
>
> '[.foo' <- function(x, i, j, ..., drop=TRUE) {
> cat("drop in foo-[ :", drop, "\n")
> }
>
> '[.bar' <- function(x, i, j, ..., drop=TRUE) {
> cat("drop in bar-[ :", drop, "\n")
> NextMethod()
> }
>
> x <- 1
> class(x) <- c("bar", "foo")
> x[1, drop=FALSE]
> # drop in bar-[ : FALSE
> # drop in foo-[ : FALSE
>
> ###############################
>
> > sessionInfo()
> R version 2.11.0 Under development (unstable) (2010-01-12 r50970)
> i386-pc-mingw32
>
> locale:
> [1] LC_COLLATE=German_Germany.1252 LC_CTYPE=German_Germany.1252
> [3] LC_MONETARY=German_Germany.1252 LC_NUMERIC=C
> [5] LC_TIME=German_Germany.1252
>
> attached base packages:
> [1] stats graphics grDevices utils datasets methods base
>
> loaded via a namespace (and not attached):
> [1] tools_2.11.0
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>
>
More information about the R-devel
mailing list