[Rd] Default argument value for "["

Iago Mosqueira imosqueira at suk.azti.es
Mon Oct 9 14:07:35 CEST 2006


El vie, 06-10-2006 a las 10:16 -0400, John Chambers escribió:
> Should now be fixed in r-devel and 2.4 patched.

Hi,

I am now working with R-devel. I am finding this problem with the same
code. When the package is installed and loaded, '[' fails with

> ple4 at catch[,1]
Error: subindex out of limits
Erro en FLQuant(x at .Data[i, j, k, l, m, drop = FALSE]) : 
        error in evaluating the argument 'object' in selecting a method
for function 'FLQuant'

but if I redefine the method by sourcing the same code inside the
session, it works fine. Calling getMethod('[','FLQuant') before and
after this operation shows no difference.

> getMethod('[','FLQuant')
Method Definition:

function (x, i = "missing", j = "missing", ..., drop = FALSE) 
{
    .local <- function (x, i = "missing", j = "missing", k = "missing", 
        l = "missing", m = "missing", ..., drop = FALSE) 
    {
        if (missing(i)) 
            i <- seq(1, length(dimnames(x at .Data)[1][[1]]))
        if (missing(j)) 
            j <- dimnames(x at .Data)[2][[1]]
        if (missing(k)) 
            k <- dimnames(x at .Data)[3][[1]]
        if (missing(l)) 
            l <- dimnames(x at .Data)[4][[1]]
        if (missing(m)) 
            m <- dimnames(x at .Data)[5][[1]]
        if (drop == FALSE) {
            flq <- FLQuant(x at .Data[i, j, k, l, m, drop = FALSE])
            units(flq) <- units(x)
            quant(flq) <- quant(x)
        }
        else flq <- x at .Data[i, j, k, l, m, ..., drop = TRUE]
        return(flq)
    }
    .local(x, i, j, ..., drop = drop)
}

Signatures:
        x        
target  "FLQuant"
defined "FLQuant"

Any idea where the problem might originate?

Thanks,


Iago




> Iago Mosqueira wrote: 
> > El mié, 04-10-2006 a las 09:52 -0400, John Chambers escribió:
> >   
> > > I think the problem in your case comes from the mechanism used to handle 
> > > non-standard argument lists; notice that you have added 3 new 
> > > arguments.
> > >     
> > 
> > Yes, our object is always 5 dimensional. We could use (...) but it
> > looked overly complex.
> > 
> >   
> > >   If you look at the body of the resulting method you will see 
> > > that the mechanism used to handle this (defining a function .local) 
> > > fails to copy the default value from the method, as in the simpler 
> > > example below:
> > > 
> > >  > setMethod("[", c("mm"), function(x, i, j, k..., drop=FALSE)browser())
> > > [1] "["
> > >  > selectMethod("[", "mm")
> > > Method Definition:
> > > 
> > > function (x, i, j, ..., drop = TRUE)
> > > {
> > >     .local <- function (x, i, j, k..., drop = FALSE)
> > >     browser()
> > >     .local(x, i, j, ..., drop = drop)
> > > }
> > > 
> > > 
> > > We can probably fix this.  Meanwhile, the workaround is to use the same 
> > > mechanism yourself, but get the  default value right.  Define your 
> > > method as a function (like the .local you see when printing the current 
> > > method) and then define a method with the formally correct arguments 
> > > (function(x, i, j, ..., drop=FALSE)) and call your function from that 
> > > method.
> > >     
> > 
> > OK, many thanks.
> > 
> >   
> > > Beware there is _another_ related "bug":  if you use callNextMethod(), 
> > > it does not seem to copy the default value of drop= either.  (It's a bit 
> > > more debatable what callNextMethod() with no arguments should do in this 
> > > case, so the problem here may be an "undesired feature" rather than a 
> > > bug.)  You didn't show your real method, so this may not apply in your 
> > > example.
> > >     
> > 
> > I am adding the whole method below, but I do not thing this applies as
> > it is currently written.
> > 
> >   
> > > By the way, I would be a little surprised if this had anything to do 
> > > with changes in 2.4.0, at least those I'm aware of.
> > >     
> > 
> > This maybe the case, but it was working fine in 2.3.1.
> > 
> > Cheers,
> > 
> > 
> > Iago
> > 
> > setMethod("[", signature(x="FLQuant"),
> > 	function(x, i="missing", j="missing", k="missing", l="missing",
> > m="missing",
> > 		..., drop=FALSE) {
> > 
> > 		if (missing(i))
> > 			#i  <-  dimnames(x at .Data)[1][[1]]
> > 			i  <-  seq(1, length(dimnames(x at .Data)[1][[1]]))
> > 		if (missing(j))
> > 			j  <-  dimnames(x at .Data)[2][[1]]
> >    		if (missing(k))
> >    			k  <-  dimnames(x at .Data)[3][[1]]
> > 		if (missing(l))
> > 			l  <-  dimnames(x at .Data)[4][[1]]
> > 		if (missing(m))
> > 			m  <-  dimnames(x at .Data)[5][[1]]
> > 
> >    		if (!drop) {
> > 	  		flq	 <- FLQuant(x at .Data[i, j, k, l, m, drop=FALSE])
> > 			units(flq) <- units(x)
> > 			quant(flq) <- quant(x)
> > 		}
> > 		else if(drop)
> >              flq  <- x at .Data[i, j, k, l, m, ..., drop=TRUE]
> > 
> >    		return(flq)
> > 	}
> > )
> > 
> > 
> >   
> > > Iago Mosqueira wrote:
> > >     
> > > > Dear all,
> > > > 
> > > > After installing R 2.4.0, a definition of "[" for an S4 class has
> > > > stopped working as the default for drop in the generic, TRUE, appears to
> > > > override the default in the method
> > > > 
> > > > The method is defined for demonstration purposes as
> > > > 
> > > > setMethod("[", signature(x="FLQuant"),
> > > > 	function(x, i="missing", j="missing", k="missing", l="missing",
> > > > 		m="missing", ..., drop=FALSE) {
> > > > 
> > > > 		print(drop)
> > > > 	}
> > > > )
> > > > 
> > > > When called as
> > > > 
> > > > new('FLQuant')[1,]
> > > > 
> > > > drop is TRUE, instead of FALSE. Am I missing something? Has there been a
> > > > change in R 2.4.0 of relevance here? I could not find it in the NEWS
> > > > file.
> > > > 
> > > > Many thanks,
> > > > 
> > > > 
> > > > Iago Mosqueira




More information about the R-devel mailing list