[R] using eval to handle column names in function calling scatterplot graph function
David Winsemius
dwinsemius at comcast.net
Sat Aug 11 04:08:18 CEST 2012
On Aug 10, 2012, at 6:23 PM, Elaine Jones wrote:
>
> I am running R version 2.15.1 in Windows XP
>
> I am having problems with a function I'm trying to create to:
> 1. subset a data.frame based on function arguments (colname &
> parmname)
> 2. rename the PARMVALUE column in the data.frame based on function
> argument (xvar)
> 3. generate charts
>
> plotvar <- function(parentdf,colname, parmname,xvar,yvar ){
> subdf <- parentdf[substr(colname,1,nchar(parmname)) == parmname,]
> names(subdf) <- sub('PARMVALUE',xvar, names(subdf))
> xvarcol <- paste("subdf","$",xvar,sep="")
> yvarcol <- paste("subdf","$",yvar,sep="")
> hist(eval(parse(text = xvarcol)), xlab = xvar, main = paste
> ("Distribution of ",xvar,sep=""))
> boxplot(eval(parse(text = yvar))~HMA, ylab=yvar, xlab="HMA",
> data=subdf)
> plot(eval(parse(text = yvarcol))~eval(parse(text = xvarcol)),
> main =
> paste(yvar," by ",xvar, sep=""), xlab = xvar, ylab = yvar)
> scatterplot(eval(parse(text = yvar))~eval(parse(text = xvar)),
> boxplots='xy', data=subdf, main = "Testcase_ID=142")
> }
>
> When I execute the function:
> plotvar(mydf,mydf$PARMNAME, "C_2TAMP","Amp_2T","C1")
>
> everything seems to work until the scatterplot statement. It posts
> this
> error:
>
> Error in parse(text = yvar) : object 'yvar' not found
Generally you will get better success with the use of as.formula()
than you will from eval(parse(text=<stuff>)). There's even a fortune
about it.
fortunes::fortune("parse")
> fortunes::fortune("parse") # actually this is only one of several
possible results
If the answer is parse() you should usually rethink the question.
-- Thomas Lumley
R-help (February 2005)
>
> However, when I insert browser() statement before the scatterplot
> statement:
>
> Browse[1]> ls()
> [1] "colname" "parentdf" "parmname" "subdf" "xvar" "xvarcol"
> "yvar" "yvarcol"
>
> yvar is there, and the value is as expected
> Browse[1]> yvar
> [1] "C1"
>
> Is this a quirk peculiar to scatterplot? (Note that boxplot which has
> similar usage worked.)
>
> I would appreciate any suggestions for how to resolve this,
> including a
> different (better) approach. mydf can have many different parameters
> (parmnames), so I am trying to come up with a generalized function
> to plot
> the data.
You probably should offer a data argument to scatterplot, and not use
the "$" construction. Instead construct the formula using the desired
column names so it can be evaluated in the context of hte data
argument. You should also include code to check to see if the unnamed
package with the scatterplot function is loaded:
> ?scatterplot
No documentation for ‘scatterplot’ in specified packages and libraries:
you could try ‘??scatterplot’
(Yes, I know it's probably the one from 'car'.)
Here's a minimal example:
data(Prestige, package=car)
scplot <- function(xvar, yvar,dvar) { form <-
as.formula( paste(xvar, yvar, sep="~") )
car::scatterplot( form, data = dvar) }
scplot("prestige", "income", Prestige)
As my tai chi teacher likes to say ... "piece of cake".
--
David Winsemius, MD
Alameda, CA, USA
More information about the R-help
mailing list