将ggplot对象存储在列表中,而无需在打印列表时绘制它们

时间:2018-12-14 14:07:11

标签: r ggplot2

我正在构建一个对数据集执行某些操作的函数,并且希望它返回在任何给定时间可能需要或不需要的各种绘图。

我现在的方法是返回对象列表,包括一些ggplot对象。

问题是,当我在不分配函数的情况下调用函数或执行结果列表时,ggplots会与列表摘要的打印一起绘制,这是我要避免的行为,因为该对象可能包含许多ggplot对象。

示例:

library(ggplot2)

df <- data.frame(
  x = 1:10,
  y = 10:1,
  g = rep(c('a', 'b'), each=5)
)

df_list <- split(df, df$g)

plot_list <- lapply(df_list, function(d){
  ggplot(d) +
    geom_point(aes(x=x, y=y))
})

plot_list

# $`a`  # plots plot_list$a
# 
# $`b`  # plots plot_list$b

我不想修改ggplot2对象的默认行为,尽管我愿意接受更高级的S3解决方案,但我不知道该怎么做。

1 个答案:

答案 0 :(得分:0)

您可以通过让函数从自定义类返回对象来简单地覆盖默认行为。

选项1:将地块归类

在这里,我们的地块现在为quiet_plot,无法打印。 要实际打印它们,您必须显式调用print.ggplot

library(ggplot2)

df <- data.frame(
  x = 1:10,
  y = 10:1,
  g = rep(c('a', 'b'), each=5)
)

df_list <- split(df, df$g)

plot_list <- lapply(df_list, function(d){
  out <- ggplot(d) +
    geom_point(aes(x=x, y=y))
  class(out) <- c("quiet_plot", class(out))
  out
})

print.quiet_plot <- function(x, ...) {
  print("A plot not displayed!")
}

plot_list

选项2-将列表归类

这使您可以指定在控制台中仅键入plot_list时希望打印列表的方式。在这里,我打印了列表的名称而不是列表的全部内容。

plot_list <- lapply(df_list, function(d){
  ggplot(d) +
    geom_point(aes(x=x, y=y))
})

class(plot_list) <- c("quiet_list", class(plot_list))

print.quiet_list <- function(x, ...) {
  cat("A list with names:")
  print(names(x))
}

plot_list