Sorry David for this belate thank. Your code helped me so much. I tested a class that does not inherit the data.frame class and it also worked. Maybe I had problems with different kinds of method signatures of [ function. For example, this does not work: setMethod("[", signature(x="BigDataFrame", j="missing", drop="logical"), function(x, i, drop=TRUE) { exp <- substitute(i) .... })
So my strategy now is dispatching on x only, defining a function with full params and checking for missing(j) if needed: setMethod("[", signature(x="myFrame"), function(x,i,j,...,drop=TRUE) { exp <- substitute(i) if(!missing(j)) // do thing on j .... }) Regards, Nhan Vu On Wed, May 15, 2013 at 10:24 AM, David Winsemius <dwinsem...@comcast.net>wrote: > > On May 14, 2013, at 8:02 PM, David Winsemius wrote: > > I think you need to read ?setClass and ?setMethod. There is an example of >> defining a "[" method for a class that inherits from 'data.frame'. I >> suspect you need to capture the various possibilities for the arguments >> being present or missing. >> >> > setClass("myFrame", contains = "data.frame", > representation(callexp = "character")) > > df1 <- data.frame(x = 1:10, y = rnorm(10), z = sample(letters,10)) > > mydf1 <- new("myFrame", df1, callexp = "") > > setMethod("[", > signature(x = "myFrame"), > function (x, i, j, ..., drop = TRUE) > {callexp <- deparse(substitute(i)) > S3Part(x) <- callNextMethod() > x@callexp <- callexp > x > } > ) > > mydf1[1:2, ] > #-------------- > Object of class "myFrame" > x y z > 1 1 -1.9119574 f > 2 2 0.2719548 i > Slot "callexp": > [1] "1:2" > > > mydf1[mydf1$x<5, ] > Object of class "myFrame" > x y z > 1 1 -0.1065694 u > 2 2 0.8571367 l > 3 3 1.7259175 z > 4 4 0.3618450 x > Slot "callexp": > [1] "mydf1$x < 5" > > > > -- >> David >> >> Sent from my iPhone >> >> On May 14, 2013, at 5:45 AM, Nhan Vu Lam Chi <nhani...@adatao.com> wrote: >> >> Dear David, >>> >>> First, I would like to say thank you for your very soon reply. Second, I >>> want to clarify the question because it seems to not carrying exactly what >>> I want to ask. Let take an example on R data.frame: >>> V1 <- 1 >>> df2 <- df[V1== 1,] # df is a data.frame, this command is correct, right? >>> >>> The evaluation steps for the above command are: >>> 1. R evaluate V1 > 1 to get TRUE >>> 2. The command becomes df2 <- df[TRUE,] which copies all rows of df to >>> df2 >>> >>> What I want is to capture the "V1 > 1" expression instead of letting R >>> do the evaluation in case of the custom [ function. Assume my class is >>> mydf, the S4 function should be: >>> setMethod("[", signature(x="mydf"), function(x,i,j,...,drop=TRUE) { >>> e <- substitute(i) >>> // do parsing and custom-evaluation tasks >>> }) >>> >>> Currently, i is always a vector of type character, numeric or logic due >>> to R evaluation. >>> >>> I am a newbie to R, so please tolerate my mistakes or misunderstanding. >>> Thanks! >>> Nhan Vu >>> >>> >>> >>> On Tue, May 14, 2013 at 12:14 PM, David Winsemius < >>> dwinsem...@comcast.net> wrote: >>> >>>> >>>> On May 13, 2013, at 6:38 PM, Nhan Vu Lam Chi wrote: >>>> >>>> Hi everyone, >>>>> I currently work on a S4 class that has the [ function. I want to >>>>> capture >>>>> the unevaluated expression corresponding to the i param using >>>>> substitute() >>>>> function and do a non-standard evaluation. However R automatically >>>>> evaluates the expression and give me its value. >>>>> For example: >>>>> Given mydf[mydf$V1 > 1,] with mydf is an object of my custom S4 >>>>> dataframe >>>>> class and V1 is one of its columns, I want to get the unevaluated >>>>> expression mydf$V1 > 1. >>>>> >>>>> My questions are: >>>>> 1. Is it possible to do that in R? >>>>> 2. If yes, how to do? >>>>> >>>> >>>> Doesn't this cry out for the S4 class definition of "[" to be >>>> answerable?. Because "[" is generic, it could have almost any definition at >>>> the whim of the package author. >>>> >>>> My R version and OS info are: >>>>> R version 2.15.3 (2013-03-01) -- "Security Blanket" >>>>> Copyright (C) 2013 The R Foundation for Statistical Computing >>>>> ISBN 3-900051-07-0 >>>>> Platform: x86_64-pc-linux-gnu (64-bit) >>>>> >>>>> This is the first time I post to the mailing list, so please forgive >>>>> any >>>>> mistakes and/or advise me if possible. >>>>> Regards, >>>>> Nhan Vu >>>>> >>>>> [[alternative HTML version deleted]] >>>>> >>>> >>>> You are forgiven, but this once, for posting in HTML. >>>> >>>> -- >>>> David Winsemius >>>> Alameda, CA, USA >>>> >>> >>> >> [[alternative HTML version deleted]] >> >> ______________________________**________________ >> R-help@r-project.org mailing list >> https://stat.ethz.ch/mailman/**listinfo/r-help<https://stat.ethz.ch/mailman/listinfo/r-help> >> PLEASE do read the posting guide http://www.R-project.org/** >> posting-guide.html <http://www.R-project.org/posting-guide.html> >> and provide commented, minimal, self-contained, reproducible code. >> > > David Winsemius, MD > Alameda, CA, USA > > [[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.