我正在构建一个对数据集执行某些操作的函数,并且希望它返回在任何给定时间可能需要或不需要的各种绘图。
我现在的方法是返回对象列表,包括一些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解决方案,但我不知道该怎么做。
答案 0 :(得分:0)
您可以通过让函数从自定义类返回对象来简单地覆盖默认行为。
在这里,我们的地块现在为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
这使您可以指定在控制台中仅键入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