[R] How to capture the expression corresponding to the i param in the [ function

David Winsemius dwinsemius at comcast.net
Wed May 15 05:24:22 CEST 2013


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 at 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 <nhanitvn at 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 <dwinsemius at 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 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.

David Winsemius, MD
Alameda, CA, USA



More information about the R-help mailing list