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 > [EMAIL PROTECTED],1] Error: subindex out of limits Erro en FLQuant([EMAIL PROTECTED], 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([EMAIL PROTECTED])[1][[1]])) if (missing(j)) j <- dimnames([EMAIL PROTECTED])[2][[1]] if (missing(k)) k <- dimnames([EMAIL PROTECTED])[3][[1]] if (missing(l)) l <- dimnames([EMAIL PROTECTED])[4][[1]] if (missing(m)) m <- dimnames([EMAIL PROTECTED])[5][[1]] if (drop == FALSE) { flq <- FLQuant([EMAIL PROTECTED], j, k, l, m, drop = FALSE]) units(flq) <- units(x) quant(flq) <- quant(x) } else flq <- [EMAIL PROTECTED], 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([EMAIL PROTECTED])[1][[1]] > > i <- seq(1, length(dimnames([EMAIL > > PROTECTED])[1][[1]])) > > if (missing(j)) > > j <- dimnames([EMAIL PROTECTED])[2][[1]] > > if (missing(k)) > > k <- dimnames([EMAIL PROTECTED])[3][[1]] > > if (missing(l)) > > l <- dimnames([EMAIL PROTECTED])[4][[1]] > > if (missing(m)) > > m <- dimnames([EMAIL PROTECTED])[5][[1]] > > > > if (!drop) { > > flq <- FLQuant([EMAIL PROTECTED], j, k, l, m, > > drop=FALSE]) > > units(flq) <- units(x) > > quant(flq) <- quant(x) > > } > > else if(drop) > > flq <- [EMAIL PROTECTED], 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 ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel