使用可选参数在R中编写ggplot函数

时间:2011-11-07 22:03:14

标签: r ggplot2

我有一系列的ggplot图表,我正在重复一些小的变化。我想将这些qplots的选项包装成一个函数,以避免代码中出现大量重复。

我的问题是,对于某些图表,我使用的是+ facet_wrap()选项,但对于其他图表,我不是。即我需要facet wrap作为可选参数。当包含它时,代码需要使用facets参数中提供的变量调用+ facet_wrap()。

理想情况下,我的函数看起来像这样,facet是一个可选参数:

$ qhist(variable, df, heading, facets)

我试过谷歌搜索如何添加可选参数,他们建议传递一个默认值或使用if循环与missing()函数。我无法上班。

这是我编写的函数,包含了可选facet参数的所需功能。

$ 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)

3 个答案:

答案 0 :(得分:11)

设置默认设置的方式如下:

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)
}

*的 修改 *

哦,好吧......所以我想我对你的要求有了更好的了解。看起来你不确定如何将可选的facet引入ggplot对象。怎么样:

  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)
  }

我根本没有测试过这段代码。但一般的想法是facet_wrap需要一个公式,所以如果facets作为字符串传递,你可以用as.formula()建立一个公式,然后将它添加到绘图对象。

如果我这样做,我会让函数接受一个可选的facet公式,然后将该facet公式直接传递给facet_wrap。这样就无需as.formula()调用将文本转换为公式。

答案 1 :(得分:3)

可能最好的办法是停止使用这些不寻常的变量名,包括逗号或空格。

作为一种解决方法,这是@JDLong答案的扩展。诀窍是重命名facet变量。

f <- function(dat, facet = NULL) {
    if(!missing(facet)) {
        names(dat)[which(names(dat) == facet)] <- ".facet."
        ff <- facet_wrap(~.facet.)
    } else {
        ff <- list()
    }
    qplot(x, y, data = dat) + ff
}

d <- data.frame(x = 1:10, y = 1:10, "o,o" = gl(2,5), check.names=F)

f(d, "o,o")
f(d)

答案 2 :(得分:2)

请注意,您还可以使用missing(facets)检查是否指定了facets参数。如果您使用@JD Long的解决方案,它将看起来像这样:

qhist <- function(variable, df, heading, facets) {
  ... insert @JD Longs' solution ...

  if (!missing(facets)) d <- d + facet_wrap(as.formula(paste("~", facets)))
  return(d)
}

...请注意,我还将默认参数从facets=NULL更改为facets

许多R函数使用这样的缺失参数,但总的来说,我倾向于选择@JD Long使用默认参数值(如NULLNA)的变体。但有时没有好的默认值...