From: Musa Parmaksiz <musa.parmaksiz_at_gmail.com>

Date: Fri, 21 Mar 2008 01:19:39 +0100

R-help_at_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. Received on Fri 21 Mar 2008 - 00:24:48 GMT

Date: Fri, 21 Mar 2008 01:19:39 +0100

signature=signature(x="myClass"), function(x, i, j, ..., drop=FALSE) { if (missing(i) && missing(j)) callNextMethod(x=x_at_x,,, ..., drop=drop) else if (missing(j)) callNextMethod(x=x_at_x, i=i, , ..., drop=drop) else if (missing(i)) callNextMethod(x=x_at_x, , j=j, ..., drop=drop) else callNextMethod(x=x_at_x, i=i, j=j, ..., drop=drop) })

one cannot distinguish between test[1] and test[1,] ! I suspect we could use nargs()...

On Fri, Mar 21, 2008 at 12:43 AM, Martin Morgan <mtmorgan_at_fhcrc.org> wrote:

> 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 <- x_at_x
**> > callNextMethod()
**>
**> I think you are hoping that x_at_x 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(x=x_at_x, 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(x=x_at_x,,, ..., drop=drop)
**> else if (missing(j))
**> callNextMethod(x=x_at_x, i=i, , ..., drop=drop)
**> else if (missing(i))
**> callNextMethod(x=x_at_x, , j=j, ..., drop=drop)
**> else
**> callNextMethod(x=x_at_x, 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(x_at_x, 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_at_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
**>
*

[[alternative HTML version deleted]]

R-help_at_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. Received on Fri 21 Mar 2008 - 00:24:48 GMT

Archive maintained by Robert King, hosted by
the discipline of
statistics at the
University of Newcastle,
Australia.

Archive generated by hypermail 2.2.0, at Fri 21 Mar 2008 - 17:30:22 GMT.

*
Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help.
Please read the posting
guide before posting to the list.
*