我有一系列的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)
答案 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使用默认参数值(如NULL
或NA
)的变体。但有时没有好的默认值...