[R] [ and setMethod conflict?
John Chambers
jmc@research.bell-labs.com
Fri, 23 Aug 2002 11:56:50 -0400
The problem was in fact not protecting the argument list in certain
circumstances. Should be fixed in the currently checked-in version.
John Chambers
John Chambers wrote:
>
> Definitely something funny going on, but perhaps a little less sweeping
> than your comments suggest.
>
> No explanation at the moment, but a couple of clues.
>
> 1. The problem doesn't seem to arise unless the data frame is large
> enough. I parametrized the 5000 rows in your example and couldn't get
> the bizarre behavior until the number of rows was larger than 1000.
>
> 2. There is some reason to think that nested "[" expressions are
> related. After rewriting your testFunc as follows, the random errors
> seemed to go away.
>
> testFunc <- function(cur) {
> ii <- order(cur[,1])
> sorted <- cur[ii,]
> ll <- !is.na(sorted[,1])
> sorted[ll,]
> }
> (the change is just to pull out the subset expressions that were
> arguments to other "[" expressions.)
>
> I'm not an expert on R internals, but the combination of these might
> suggest garbage collection taking place in nested calls to the dispatch
> code for "[".
>
> John Chambers
>
>
> "Bartz, Kevin" wrote:
> >
> > I noticed this oddity about [ and setMethod.
> >
> > First, I define testFunc, which sorts a data frame by the first column and
> > returns the entries that aren't NAs, and testIt, which runs testFunc
> > repeatedly on a random large data frame, each time saving the return into a
> > dummy placeholder (for demonstration's sake).
> >
> > > require(methods)
> > Loading required package: methods
> > [1] TRUE
> > > testFunc <- function(cur) {
> > + sorted <- cur[order(cur[,1]),]
> > + sorted[!is.na(sorted[,1]),]
> > + }
> > > testIt <- function(num)
> > + for (i in 1:num) {
> > + cat("iteration", i, "...\n")
> > + dummy <- testFunc(as.data.frame(matrix(rnorm(5000 * 9),9)))
> > + }
> >
> > Let's test out testIt.
> >
> > > testIt(10)
> > iteration 1 ...
> > iteration 2 ...
> > iteration 3 ...
> > iteration 4 ...
> > iteration 5 ...
> > iteration 6 ...
> > iteration 7 ...
> > iteration 8 ...
> > iteration 9 ...
> > iteration 10 ...
> >
> > So far, no problems. Next, I define myClass.
> >
> > > setClass("myClass", representation(mySlot = "numeric"))
> > [1] "myClass"
> > > setMethod("[", signature(x = "myClass"),
> > + function(x, i, j, drop) "[ for myClass")
> > [1] "["
> >
> > Again, everything is fine. I've expanded [ to handle objects of class
> > myClass. But when we attempt to use testIt now, problems emerge:
> >
> > > testIt(10)
> > iteration 1 ...
> > Error in "[.data.frame"(cur, order(cur[, 1]), ) :
> > unused argument(s) (.Method ...)
> >
> > Maybe that was just a fluke. Trying again, we get:
> >
> > > testIt(10)
> > iteration 1 ...
> > iteration 2 ...
> > Error in sorted[, 1] : incorrect number of dimensions
> >
> > A different message every time, and the error seems no bug of mine (a
> > .Method argument? What is that?). In fact, testIt produces a seemingly
> > random response from R on each subsequent attempt--everything from
> > successful execution to similarly ambiguous errors to a process-killing "Bus
> > Error."
> >
> > All in all, it seems that once I've defined a new method for [ I can no
> > longer count on it to operate properly in any context.
> >
> > Is this the intended behavior? And if so, is there any way I can have one
> > class present that overloads [ and still use [ to reliably subset data
> > frames?
> >
> > Thanks,
> >
> > Kevin
> >
> > > R.version
> > _
> > platform sparc-sun-solaris2.6
> > arch sparc
> > os solaris2.6
> > system sparc, solaris2.6
> > status
> > major 1
> > minor 5.1
> > year 2002
> > month 06
> > day 17
> > language R
> > -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
> > r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
> > Send "info", "help", or "[un]subscribe"
> > (in the "body", not the subject !) To: r-help-request@stat.math.ethz.ch
> > _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
>
> --
> John M. Chambers jmc@bell-labs.com
> Bell Labs, Lucent Technologies office: (908)582-2681
> 700 Mountain Avenue, Room 2C-282 fax: (908)582-3340
> Murray Hill, NJ 07974 web: http://www.cs.bell-labs.com/~jmc
> -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
> r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
> Send "info", "help", or "[un]subscribe"
> (in the "body", not the subject !) To: r-help-request@stat.math.ethz.ch
> _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
--
John M. Chambers jmc@bell-labs.com
Bell Labs, Lucent Technologies office: (908)582-2681
700 Mountain Avenue, Room 2C-282 fax: (908)582-3340
Murray Hill, NJ 07974 web: http://www.cs.bell-labs.com/~jmc
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !) To: r-devel-request@stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._