From: Tony Plate <tplate_at_acm.org>

Date: Fri 29 Apr 2005 - 07:39:45 EST

*>
*

> logical types

*>
*

*>
*

*> I can not understand why is that, even after I've tried to convert
*

*> properly the string into an expression.
*

*> I've been all the day trying to sort that problem ...
*

*> Maybe this attempt is ackward and I have not understood what is really
*

*> behind an expression.
*

*> But if anyone could give me a tip concerning this problem or point me to
*

*> relevant references, I would really appreciate.
*

*>
*

*> Thanks
*

*> Pascal Boisson
*

*> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
*

*>
*

*> DISCLAIMER:\
*

*> \ This email is from the Scottish Crop Researc...{{dropped}}
*

*>
*

*> ______________________________________________
*

*> R-help@stat.math.ethz.ch mailing list
*

*> https://stat.ethz.ch/mailman/listinfo/r-help
*

*> PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
*

>

R-help@stat.math.ethz.ch mailing list

https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html Received on Fri Apr 29 07:46:46 2005

Date: Fri 29 Apr 2005 - 07:39:45 EST

You are passing just a string to subset(). At the very least you need to parse it (but still this does not work easily with subset() -- see below). But are you sure you need to do this? subset() for dataframes already accepts subset expressions involving the columns of the dataframe, e.g.:

> df <- data.frame(x=1:10,y=rep(1:5,2))
> subset(df, y==2)

x y

2 2 2

7 7 2

>

However, it's tricky to get subset() to work with an expression for its subset argument. This is because of the way it evaluates its subset expression (look at the code for subset.data.frame()).

> subset(df, parse(text="df$y==2"))

Error in subset.data.frame(df, parse(text = "df$y==2")) :

'subset' must evaluate to logical
> subset(df, parse(text="y==2"))

Error in subset.data.frame(df, parse(text = "y==2")) :

'subset' must evaluate to logical >

It's a little tricky in general passing R language expressions around, because many functions that work with expressions work with the unevaluated form of the actual argument, rather than with an R language expression as the value of a variable. E.g.:

> with(df, y==2)

** [1] FALSE TRUE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
**
> cond <- parse(text="y==2")

> cond

expression(y == 2)

> with(df, cond)

expression(y == 2)

One way to make these types of functions work with R language expressions as the value of a variable is to use do.call():

> do.call("with", list(df, cond))

** [1] FALSE TRUE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
**
>

So, returning to subset(), you can give it an expression that is stored in the value of a variable like this:

> do.call("subset", list(df, cond))

x y

2 2 2

7 7 2

>

However, if you're a beginner at R, I suspect that you'll get much further if you avoid such meta-language constructs and just find a way to make subset() work for you without trying to paste together R language expressions.

Hope this helps,

- Tony Plate

Pascal Boisson wrote:

> Hello all,

*>
**> I have some trouble in reconstructing a valid expression within a
**> function,
**> here is my question.
**>
**> I am building a function :
**>
**> SUB<-function(DF,subset=TRUE) {
**> #where DF is a data frame, with Var1, Var2, Fact1, Fact2, Fact3
**> #and subset would be an expression, eg. Fact3 == 1
**>
**> #in a first time I want to build a subset from DF
**> #I managed to, with an expression like eg. DF$Fact3,
**> # but I would like to skip the DF$ for convenience
**> # so I tried something like this :
**>
**> tabsub<-deparse(substitute(subset))
**> dDF<-deparse(substitute(DF))
**>
**> if (tabsub[1]!="TRUE") {
**> subset<-paste(dDF,"$",tabsub,sep="")}
**>
**> #At this point, I have a string that seems to be the expression that I
**> want
**> sDF<-subset(DF, subset)
**> }
**>
**> #But I have an error message :
**>
*

>>Error in r & !is.na(r) : operations are possible only for numeric or

> logical types

>

R-help@stat.math.ethz.ch mailing list

https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html Received on Fri Apr 29 07:46:46 2005

*
This archive was generated by hypermail 2.1.8
: Fri 03 Mar 2006 - 03:31:28 EST
*