Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Writing ggplot functions in R with optional arguments

Tags:

r

ggplot2

I have a series of ggplot graphs that I'm repeating with a few small variations. I would like to wrap these qplots with their options into a function to avoid a lot of repetition in the code.

My problem is that for some of the graphs I am using the + facet_wrap() option, but for others I am not. I.e. I need the facet wrap to be an optional argument. When it is included the code needs to call the +facet_wrap() with the variable supplied in the facets argument.

So ideally my function would look like this, with facets being an optional argument:

$ qhist(variable, df, heading, facets)

I have tried googling how to add optional arguments and they suggest either passing a default value or using an if loop with the missing() function. I haven't been able to get either to work.

Here is the function that I have written, with the desired functionality of the optional facets argument included too.

$ qhist <- function(variable, df, heading, facets) {
      qplot(variable, data = df, geom = "histogram", binwidth = 2000, 
            xlab = "Salary", ylab = "Noms") + 
      theme_bw() +
      scale_x_continuous(limits=c(40000,250000), 
                 breaks=c(50000,100000,150000,200000,250000), 
                 labels=c("50k","100k","150k","200k","250k")) +
      opts(title = heading, plot.title = theme_text(face = "bold", 
           size = 14), strip.text.x = theme_text(size = 10, face = 'bold')) 
      # If facets argument supplied add the following, else do not add this code
      + facet_wrap(~ facets)
like image 437
Tom McMahon Avatar asked Nov 07 '11 22:11

Tom McMahon


1 Answers

the way to set up a default is like this:

testFunction <- function( requiredParam, optionalParam=TRUE, alsoOptional=123 ) {
  print(requiredParam)
  if (optionalParam==TRUE) print("you kept the default for optionalParam")
  paste("for alsoOptional you entered", alsoOptional)
}

*EDIT*

Oh, ok... so I think I have a better idea of what you are asking. It looks like you're not sure how to bring the optional facet into the ggplot object. How about this:

  qhist <- function(variable, df, heading, facets=NULL) {
  d <- qplot(variable, data = df, geom = "histogram", binwidth = 2000, 
        xlab = "Salary", ylab = "Noms") + 
  theme_bw() +
  scale_x_continuous(limits=c(40000,250000), 
             breaks=c(50000,100000,150000,200000,250000), 
             labels=c("50k","100k","150k","200k","250k")) +
  opts(title = heading, plot.title = theme_text(face = "bold", 
       size = 14), strip.text.x = theme_text(size = 10, face = 'bold')) 
  # If facets argument supplied add the following, else do not add this code
  if (is.null(facets)==FALSE) d <- d + facet_wrap(as.formula(paste("~", facets)))
  d
  return(d)
  }

I have not tested this code at all. But the general idea is that the facet_wrap expects a formula, so if the facets are passed as a character string you can build a formula with as.formula() and then add it to the plot object.

If I were doing it, I would have the function accept an optional facet formula and then pass that facet formula directly into the facet_wrap. That would negate the need for the as.formula() call to convert the text into a formula.

like image 134
JD Long Avatar answered Sep 29 '22 12:09

JD Long