如何在函数内编写facet_wrap(ggplot2)

9

我写了一个画条形图的函数。但是当我使用facet wrap时,符号'~'使事情变得困难。

rf.funct <- function(dat, predictor, feature){
  ggplot(get(dat), aes(get(predictor), N)) +
    geom_bar(stat = 'identity') +
    facet_wrap(get(~feature)) # this is where the problem is
}

我尝试了以下操作:
facet_wrap((get(~feature))) # invalid first argument
facet_wrap(paste0("~ ", get(feature))) # object 'feature' not found

如何确保函数中包含“~”符号?

特性是一个字符串还是? - JasonWang
1
如果从您的代码中删除 get,会发生什么? - Jake Kaupp
1
facet_wrap(paste("~", feature))。正如@JakeKaupp所说,摆脱所有的“get”实例。 - eipi10
2个回答

11
你不需要使用 get,你已经通过 dat 参数将数据框传递到函数中了,只需将 dat 提供给 ggplot,它就会从其环境中获取数据。
rf.funct <- function(dat, predictor, feature) {
  ggplot(dat, aes_string(predictor, "N")) +
    geom_bar(stat = 'identity') +
    facet_wrap(feature)
}

predictorfeature 参数应该被输入为字符串。然后,您可以使用 aes_string 来指定美学元素。facet_wrap 现在可以直接使用字符向量,而不需要公式(正如 @WeihuangWong 指出的那样)。


1
在ggplot 2.1.0中,“facets”参数可以是“公式或字符向量。使用单侧公式'〜a + b'或字符向量'c(“a”,“b”)'。”因此,如果OP正在使用更新版本的ggplot,则“paste(...)”可能是多余的。 - Weihuang Wong
我使用get()是因为函数在ggplot代码之前包含了一些data.table代码。我明白在ggplot部分不需要使用get(),谢谢! - ant
感谢@WeihuangWong。我已经相应地更新了我的答案。 - eipi10

3

我曾经遇到过类似的问题,这里的答案和评论帮助我解决了它。不过,这篇文章已经发布了6年了,我认为现代化的解决方案应该是这样的:

rf.funct <- function(dat, predictor, feature){
  ggplot(dat, aes({{predictor}}, N)) +
    geom_bar(stat = 'identity') +
    facet_wrap(enquo(feature))
}

虽然我同意你现在看起来这似乎是推荐的路径,但我承认我很难理解为什么有人会认为这在可读性或清晰度方面是一种改进。 - bizzinho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接