Hi Musa -- Musa Parmaksiz wrote: > Hi R-Help, > > Please consider the following simple case: I have a class like > > setClass("myClass", > representation(x="matrix", y="character")) > > and I would like to use the method *"["* for a *myClass* objects (but > changing the default *drop* argument from TRUE to FALSE): > > setMethod("[","myClass", > function(x,i,j,...,drop=FALSE) > { > x <- [EMAIL PROTECTED] > callNextMethod()
I think you are hoping that [EMAIL PROTECTED] will be subsetted, and it appears that it is. But I think this is a bug. 'callNextMethod' without any arguments should be using the 'x' in the signature. This should result in an error like the one seen here setMethod("[", signature=signature(x="myClass"), function(x, i, j, ..., drop=FALSE) { callNextMethod() }) > test[1,] Error in x[i = i, j = , ...] : object is not subsettable Normally, to change the value of the variable 'seen' by the next method, one would expect to have to write something like setMethod("[", signature=signature(x="myClass"), function(x, i, j, ..., drop=FALSE) { callNextMethod([EMAIL PROTECTED], i=i, j=j, ..., drop=drop) }) You can now see how this is a little more complicated -- if j is missing in the original function call, then it can't be used in an assignment in callNextMethod. You'd have to write something like setMethod("[", signature=signature(x="myClass"), function(x, i, j, ..., drop=FALSE) { if (missing(i) && missing(j)) callNextMethod([EMAIL PROTECTED],,, ..., drop=drop) else if (missing(j)) callNextMethod([EMAIL PROTECTED], i=i, , ..., drop=drop) else if (missing(i)) callNextMethod([EMAIL PROTECTED], , j=j, ..., drop=drop) else callNextMethod([EMAIL PROTECTED], i=i, j=j, ..., drop=drop) }) or, since this is really an implementation that dispatches on the 'misssing'-ness of i, j, a series of methods like setMethod("[", signature=signature( x="myClass", i="ANY', j="missing") function(x, i, j, ..., drop=FALSE) { callNextMethod([EMAIL PROTECTED], i=i, , ..., drop=drop) }) Notice too how it is necessary to specify the argument list in quite an odd way, with a ',' for the 'missing' variable(s). This is because "[" is a so-called 'Primitive' function, and primitive functions match by position rather than the usual matching by name: > matrix(1:20,5)[4,2] [1] 9 > matrix(1:20,5)[j=4,i=2] [1] 9 ! I read somewhere that when faced with learning complicated systems, otherwise intelligent people will develop wildly inaccurate stories to explain why the system 'works'. The above is my story. Martin > x<-as.myClass(x) > } > ) > > suppose that *as.myClass* method has been already defined. Actually, all I > want is to pass all the arguments to *"["* method for *matrix*, except > changing the default behaviour for *drop*. > > When I execute: >> test<-new("myClass",x=cbind(1:3,4:6),y="a") >> test[1,] # works as expected > [1] 1 4 > >> test[1,drop=TRUE] # does not work > Error: argument "j" is missing, with no default > Error in callNextMethod() : error in evaluating a 'primitive' next method > > but with a matrix the two cases work: >> m<-cbind(1:3,4:6) >> m[1,] > [1] 1 4 >> m[1,drop=TRUE] > [1] 1 > > Can you please advise me a solution for this problem? > Thank you in advance for the help. > > Musa > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. -- Martin Morgan Computational Biology / Fred Hutchinson Cancer Research Center 1100 Fairview Ave. N. PO Box 19024 Seattle, WA 98109 Location: Arnold Building M2 B169 Phone: (206) 667-2793 ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.