我想定义一个使用软件包gridSVG中的gridsvg设备的绘图保存功能。
library(ggplot2)
library(gridExtra)
mtcars$gear <- factor(mtcars$gear,levels=c(3,4,5),
labels=c("3gears","4gears","5gears"))
mtcars$am <- factor(mtcars$am,levels=c(0,1),
labels=c("Automatic","Manual"))
mtcars$cyl <- factor(mtcars$cyl,levels=c(4,6,8),
labels=c("4cyl","6cyl","8cyl"))
myPlot <- qplot(mpg, data=mtcars, geom="density", fill=gear, alpha=I(.5),
main="Distribution of Gas Milage", xlab="Miles Per Gallon",
ylab="Density")
savePlot <- function(filename, plot, plotWidth = 15, plotHeight = 10){
gridSVG:::gridsvg(name = filename, width = plotWidth, height = plotHeight)
print(plot)
dev.off(which = dev.cur())
}
但是,如果我随后尝试使用该功能,它将无法正常工作。错误导致:
savePlot("~/Desktop/myplot.svg", myPlot)
Show Traceback
Rerun with Debug
Error in eval(expr, envir, enclos) : object 'filename' not found
但是,如果我从控制台执行这些步骤,它将起作用:
gridSVG::gridsvg(name = "~/Desktop/myPlot.svg", width = 15, height = 10)
myPlot
dev.off()
有没有办法可以从另一个函数中使用gridsvg函数?
我想知道我是否可以在某些环境下进行评估。
谢谢,
本
最佳答案
这是一种回旋,但有些原则,但不将所有内容都粘在全球环境中(受R Inferno中的范围讨论的启发):
library(gridSVG)
savePlot <- function(filename, plot, plotWidth = 15, plotHeight = 10){
gridsvg(sys.frame(1))
print(plot)
grid.export(filename)
grDevices::dev.off(which = dev.cur())
}
sys.frame(1)
为我们提供了父上下文的评估框架(对于访问调用堆栈的函数的所有变体,都有一个好的解释here)。我将对
grid.export()
的调用与对dev.off()
的调用分开了,因为从gridSVG所做的基本上所有dev.off
都是先调用grid.export
,然后再调用grDevices::dev.off
。这也使我们可以将文件名显式提供给grid.export
。