Gebe,

Your suggestion only works in an environment where no formal argument 
'i' is defined in any of existing  '[' method. e..g

 > showMethods("[")
Function: [ (package base)
x="nonStructure"

Once we load the package that exports '[' methods with 'i' (e.g. 
'flowCore' ), then method dispatch still tries to evaluate 'i'  in order 
to match the call to the available methods.

 > library(flowCore)
 > showMethods("[")
Function: [ (package base)
x="AnnotatedDataFrame", i="ANY"
x="container", i="ANY"
x="eSet", i="ANY"
x="filterResultList", i="ANY"
x="filterSet", i="character"
x="flowFrame", i="ANY"
...

 > y[holycrapnothere]
Error: object 'holycrapnothere' not found


Mike
On 08/06/2014 11:45 AM, Gabe Becker wrote:
> Mike,
>
> This can be done. I would argue that the convenience your users get 
> from this is far outweighed by the damage this does to the ability to 
> read and easily understand the code they are writing. Users, 
> maintainers, etc now need to know the object class, what columns it 
> has and what variables are in their environment in order to predict a 
> '['  expression's behavior. (This is why most people I know to won't 
> touch the attach function with a 10 foot pole, regardless of how 
> convenient it seems at first).
>
> But anyway, I'm not the design police and my dislike of non-standard 
> evaluation is far from universal, so here is how to do it:
>
>     > setClass("toydf", representation(x = "data.frame"))
>     > setMethod("[", "toydf", function(x, i, j, ...) {key =
>     substitute(i) ; eval(key, x@x, parent.frame())})
>     [1] "["
>     > x = data.frame(holycrapnothere = 1:6)
>     > y = new("toydf", x= x)
>     > y
>     An object of class "toydf"
>     Slot "x":
>       holycrapnothere
>     1               1
>     2               2
>     3               3
>     4               4
>     5               5
>     6               6
>
>     > holycrapnothere
>     Error: object 'holycrapnothere' not found
>     No suitable frames for recover()
>
>     > y[holycrapnothere]
>     [1] 1 2 3 4 5 6
>
>
> ~G
>
>
>
> On Wed, Aug 6, 2014 at 10:43 AM, Mike <wjiang2@fhcrc.org 
> <mailto:wjiang2@fhcrc.org>> wrote:
>
>     I'd like to do 'data.table-like' subsetting on `S4 class` by using
>     'i expression'. However, '[' generic function has the problem to
>     dispatch S4 method because of its early evaluation of i argument.
>     e.g.
>
>     > gslist[Visit == 1, ]
>     Error in gslist[Visit == 1, ] :
>       error in evaluating the argument 'i' in selecting a method for
>     function '[': Error: object 'Visit' not found
>
>     Here 'gslist' is a S4 object `GatingSet` .
>
>     I wasn't able to bypass this even after I defined my own S3 method
>     (e.g [.GatingSet).
>     I guess it is because 'GatingSet' is S4 class and there are
>     already some S4 methods defined by other packages
>
>     > showMethods("[")
>     Function: [ (package base)
>     x="AnnotatedDataFrame", i="ANY"
>     x="flowFrame", i="ANY"
>     ...
>
>     So it will always try these S4 methods before any S3 gets its chance.
>
>     Is there better way other than these two?
>     1. change 'GatingSet' to S3 class
>     2. use a different generic function that is not associated with
>     any S4 methods (e.g. subset)
>
>     Mike
>
>     _______________________________________________
>     Bioc-devel@r-project.org <mailto:Bioc-devel@r-project.org> mailing
>     list
>     https://stat.ethz.ch/mailman/listinfo/bioc-devel
>
>
>
>
> -- 
> Computational Biologist
> Genentech Research


	[[alternative HTML version deleted]]

