我想定义一个使用软件包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

10-08 05:06