On 8/27/2008 1:15 PM, Peter Flom wrote:
Hello

I wrote a simple program to modify a boxplot:

<<<

gdsbox <- function(indvar){
boxplot(indvar~gds3lev, main = paste('Boxplot of', substitute(indvar), "for GDS groups"),
   names = c('1', '3', '4, 5, 6'))
}



If I attach the dataframe gdsgraph, this works fine. However, I've been warned 
against attach.  When I tried to run this program using 'with', it did not work.

e.g.
           with(gdsgraph, gdsbox(BReT3T5T))

produced an error that gds3level was not found

but if I try

          with(gdsgraph, boxplot(BReT3T5T~gds3lev))

it works fine.

Similar problems occurred when I tried to use data =

What am I missing?

You defined your gdsbox function in the global environment, which means it will go looking for non-local variables there. It doesn't matter where you call it from, R uses lexical scoping.

To get what you want, you could define your function within the with, i.e.

with(gdsgraph, {

 gdsbox <- function(indvar){
 boxplot(indvar~gds3lev,
    main = paste('Boxplot of', substitute(indvar), "for GDS groups"),
    names = c('1', '3', '4, 5, 6'))
 }

 gdsbox(BReT3T5T)
})

but this misses the point of defining gdsbox once, and using it in many places. So I'd say the best thing to do is to change the definition of it to use the data argument, i.e.

gdsbox <- function(indvar, data) {
    boxplot(indvar~gds3lev,
    main = paste('Boxplot of', substitute(indvar), "for GDS groups"),
    names = c('1', '3', '4, 5, 6'), data=data)
 }

and call it as

gdsbox(BReT3T5T, gdsgraph)

There are ways to make your function act as though it doesn't use lexical scoping (parent.env, etc.), but they are ugly, and I don't think they're necessary here.

Duncan Murdoch

______________________________________________
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.

Reply via email to