如何让R语言父函数返回两个独立绘图对象而非仅返回第二个?
解决方案:返回两个独立绘图对象
在R中,基础绘图系统(plot()这类函数)默认直接将图像输出到绘图设备,不会返回可存储的对象。你需要用可生成绘图对象的工具,或者捕获基础绘图的对象,才能将两个绘图作为独立对象返回。
方案1:使用ggplot2生成绘图对象(推荐)
ggplot2会返回ggplot类的对象,可轻松存储和返回多个这类对象:
library(ggplot2) test_fx <- function() { # 定义第一个绘图函数,返回ggplot对象 plot1_fx <- function() { df1 <- data.frame(x = c(1,2,3), y = c(3,4,5)) ggplot(df1, aes(x, y)) + geom_line() + geom_vline(xintercept = 1.5, color = "red", linewidth = 5) } # 定义第二个绘图函数,返回ggplot对象 plot2_fx <- function() { df2 <- data.frame(x = c(1,2,3), y = c(5,4,3)) ggplot(df2, aes(x, y)) + geom_line() + geom_vline(xintercept = 2.5, color = "blue", linewidth = 5) } # 返回两个绘图对象组成的列表 list(plot1 = plot1_fx(), plot2 = plot2_fx()) } # 调用函数,获取两个绘图对象 plots <- test_fx() # 查看第一个绘图 plots$plot1 # 查看第二个绘图 plots$plot2
方案2:捕获基础绘图的对象(recordPlot)
如果坚持使用基础绘图系统,可通过recordPlot()捕获已绘制的图像,转为可存储的对象:
test_fx <- function() { # 定义第一个绘图并捕获对象 plot1_fx <- function() { plot(x=c(1,2,3),y=c(3,4,5), type='l') abline(v=1.5, col="red", lwd=5) recordPlot() # 捕获当前绘图 } # 定义第二个绘图并捕获对象 plot2_fx <- function() { plot(x=c(1,2,3),y=c(5,4,3), type='l') abline(v=2.5, col="blue", lwd=5) recordPlot() # 捕获当前绘图 } # 返回两个捕获的绘图对象 list(plot1 = plot1_fx(), plot2 = plot2_fx()) } # 调用函数获取对象 plots <- test_fx() # 重新绘制第一个图像 replayPlot(plots$plot1) # 重新绘制第二个图像 replayPlot(plots$plot2)
原代码只显示第二个绘图的原因
原代码中,plot1_fx()和plot2_fx()直接输出到绘图设备,而R函数默认仅返回最后一行代码的执行结果(这里是plot2_fx()的返回值,基础绘图函数返回NULL)。同时第二个绘图会覆盖第一个绘图的设备内容,因此只能看到第二个。
内容的提问来源于stack exchange,提问作者bshelt141
相关产品推荐
相关产品推荐

