Hi,

I modified the method as following

setMethod("[", signature=signature(x="myClass"),
          function(x, i, j, drop=FALSE)
          {
            myCall <- sys.call(-1)
            narg <- length(myCall)-length(match.call(call=sys.call(-1)))

            if (missing(i) && missing(j)) {
              res <- callNextMethod([EMAIL PROTECTED],,,drop=drop)
            } else if (missing(j)) {
              if (narg>0) res <- callNextMethod([EMAIL 
PROTECTED],i=i,,drop=drop)
              else res <- callNextMethod([EMAIL PROTECTED],i=i,drop=drop)
            } else if (missing(i)) {
              if (narg>0) res <- callNextMethod([EMAIL 
PROTECTED],,j=j,drop=drop)
              else res <- callNextMethod([EMAIL PROTECTED],j=j,drop=drop)
            } else {
              res <- callNextMethod([EMAIL PROTECTED],i=i,j=j,drop=drop)
            }
            return(res)
          }
          )

This mimics the "[" for matrices, but with arguments name matching
included.  It also interprets myClass[i=1] and myClass[j=1] the same way,
which is a desirable side effect. I agree with your points, but from an
end-user point of view (who will "see" myClass as a matrix), distinguishing
myClass[1]  and myClass[1,]  is suitable.
Thanks again for the help...


On Fri, Mar 21, 2008 at 6:05 PM, Martin Morgan <[EMAIL PROTECTED]> wrote:

> Hi Musa --
>
> Musa Parmaksiz wrote:
> > Hi Martin,
> >
> > Thanks for the suggestions.
> >
> > If possible I would avoid defining several methods with different
> > signatures. For the first solution,namely
> >
> > 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)
> >       })
> >
> > one cannot distinguish between test[1] and test[1,] ! I suspect we could
> > use nargs()...
>
> I thought I had seen a cleaner solution to this; perhaps someone else
> will contribute. Here's what I think:
>
> One could do something like nargs() - length(list(...)) -
> !missing(drop), but as a class designer a better decision might be to
> define [1] to be the same as [1,], and provide other ways for the
> user to convert a matrix-like object to a vector-like object.
>
> To make this point a bit stronger, an interpretation of '[' is that it
> returns a subset of the original object (i.e., an object of the same
> class as the original). This is in contrast to '[[', which might be
> interpreted as returning the contents of (a subset of) the
> object. '[' returning a vector-like object when invoked on a
> matrix-like object violates this interpretation, and might therefore
> be avoided.
>
> Also, it might seem good to 'mimic' the behavior of [ on matrices.
> But remember that the method defined above matches arguments by name
> rather than position, so already one is departing from the way in
> which subsets work with the primitive [. I would say that this
> departure is an improvement over the situation with primitive [, and
> it would be a mistake to implement [ for myClass in such a way as to
> restore position-matching.
>
> These are my opinions, probably others arrive at different conclusions.
>
> Martin
>
> > On Fri, Mar 21, 2008 at 12:43 AM, Martin Morgan <[EMAIL PROTECTED]
> > <mailto:[EMAIL PROTECTED]>> 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 <- [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 <mailto: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
> >
> >
>
>
> --
> 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@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.

Reply via email to