Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ggplot inside a function: when does it not recognize arguments and when does it? [duplicate]

Tags:

r

ggplot2

Consider the following two functions:

library(ggplot2)

testdata <- as.data.frame(cbind(rep(c(1, 4), each = 50), rbinom(100, 50, .5)))
names(testdata) <- c("group", "value")

plotfun1 <- function(color) {
  ggplot(data = testdata, aes(x = factor(group, levels = c(0: 4)), y = value)) + 
    geom_boxplot(color = color) 
}

plotfun2 <- function(number) {
  ggplot(data = testdata, aes(x = factor(group, levels = c(0: number)), y = value)) + 
    geom_boxplot(color = 'red') 
}

Plotfun1 works perfectly, calling

plotfun1('red') 

yields two nice red boxplots. However calling

plotfun2(4)

yields the error message:

Error in factor(group, levels = c(0:number)) : object 'number' not found

apparently in some cases ggplot is not able to 'find' the arguments of the function, and in some cases it is. What is going on here?

PS I know there is an easy work around:

plotfun3 <- function(number) {
  plotdata <- testdata
  plotdata$group <- factor(plotdata$group, levels = c(0: number))
  ggplot(data = plotdata, aes(x = group, y = value)) + 
    geom_boxplot(color = 'red') 
}

I just want to understand what is going on.)

like image 662
Vincent Avatar asked Jul 19 '13 09:07

Vincent


1 Answers

Capture the local environment and use it when plotting:

plotfun2 <- function(number) {
localenv <- environment()
  ggplot(data = testdata, aes(x = factor(group, levels = c(0:number)), y = value), environment = localenv ) + 
    geom_boxplot(color = 'red') 
}

plotfun2(4)
like image 180
Jonas Tundo Avatar answered Sep 17 '22 23:09

Jonas Tundo