如何实现R函数调用时不自动输出绘图,按需获取绘图对象
解决方案
在R中,base绘图是即时产生绘图副作用的,直接调用plot()会立刻弹出图形。要实现调用函数时不绘图、仅获取$Plot才显示的效果,有三种常用方案:
方案1:用recordPlot()记录绘图(base绘图适用)
先将绘图输出到临时空设备中,用recordPlot()记录绘图状态,调用函数时不会显示图形,只有访问$Plot时才会回放记录的绘图:
example <- function(x, y){ # 打开临时空设备,无可视化输出 pdf(nullfile()) # 执行绘图操作,仅在空设备中完成 plot(x, y) # 记录当前绘图状态 Plot <- recordPlot() # 关闭临时设备 dev.off() # 计算均值 Mean <- c(mean(x), mean(y)) # 返回结果列表 return(list(Plot = Plot, Mean = Mean)) } set.seed(1) x <- rnorm(10) set.seed(2) y <- rnorm(10) # 调用函数仅返回列表,无绘图弹出 example(x, y) # 获取$Plot时,回放并显示绘图 example(x, y)$Plot
方案2:封装绘图为函数(灵活可控)
把绘图逻辑封装成函数存入列表,需执行该函数才会显示图形,可自定义绘图参数:
example <- function(x, y){ # 封装绘图逻辑为函数 Plot <- function() { plot(x, y, main = "x与y的散点图", col = "blue") # 可自定义绘图样式 } Mean <- c(mean(x), mean(y)) return(list(Plot = Plot, Mean = Mean)) } # 调用函数无绘图输出 example(x, y) # 执行Plot函数才会显示图形 example(x, y)$Plot()
方案3:使用ggplot2(推荐面向对象绘图)
ggplot2本身返回绘图对象,不会自动显示,只有打印该对象时才会绘图,完美匹配需求:
library(ggplot2) example <- function(x, y){ # 创建ggplot对象,不会自动显示 Plot <- ggplot(data.frame(x = x, y = y), aes(x, y)) + geom_point(color = "red") + labs(title = "x vs y") Mean <- c(mean(x), mean(y)) return(list(Plot = Plot, Mean = Mean)) } # 调用函数仅返回列表,无绘图 example(x, y) # 获取$Plot时自动打印并显示图形 example(x, y)$Plot
内容的提问来源于stack exchange,提问作者J.Z.
相关产品推荐
相关产品推荐

