R 了解如何读取设备列表
我遇到了一个关于开放设备列表的相当恼人的问题,试图构造一个函数,为列表保存一些图形。假设我们有以下数据:R 了解如何读取设备列表,r,graphics,device,R,Graphics,Device,我遇到了一个关于开放设备列表的相当恼人的问题,试图构造一个函数,为列表保存一些图形。假设我们有以下数据: Alist <- list( X1 = data.frame(X=rnorm(10),Y=1:10), X2 = data.frame(X=rnorm(10),Y=1:10), X3 = data.frame(X=rnorm(10),Y=1:10) ) 如果我将添加到.exit({print(dev.cur());dev.off()},add=T),我将得到以下输出: &
Alist <- list(
X1 = data.frame(X=rnorm(10),Y=1:10),
X2 = data.frame(X=rnorm(10),Y=1:10),
X3 = data.frame(X=rnorm(10),Y=1:10)
)
如果我将添加到.exit({print(dev.cur());dev.off()},add=T)
,我将得到以下输出:
> fnames <- myPlotFunc(Alist,save=T)
pdf
5
windows
2
pdf
3
但这感觉相当尴尬。我有没有遗漏什么,或者有更好的方法来解决这个问题
免责声明:
如果您不知道,请在运行第三个代码块后运行
dev.off()
。完成后,您可以通过运行取消链接(fnames)
轻松清理。一个彻底的解决方案可能是使用graphics.off()
而不是尝试关闭脚本打开的设备。如果这只是用户代码,那么如果所有图形设备在退出时都关闭了,这也许无关紧要
使用这种残酷的方法似乎有效:
myPlotFunc <- function(x,save = FALSE) {
fnames <- paste(names(x),"pdf",sep=".")
if(save)
on.exit(graphics.off(),add = TRUE)
for(i in 1:length(x)) {
if(save) {
pdf(fnames[i])
}
plot(x[[i]])
}
fnames
}
似乎编号最低的设备是R在调用
dev.off()
后激活的设备,这将是您描述的设置中的屏幕设备,因此也是您的报告的行为。让帮助功能执行一个绘图如何:
myPlotFunc <- function(x, save=FALSE) {
fnames <- paste(names(x), "pdf", sep=".")
plot_one <- function(xx, fname, save=save) {
if (save) {
pdf(fname)
on.exit(dev.off())
}
plot(xx)
}
for (i in 1:length(x)) plot_one(x[[i]], fnames[i], save)
fnames
}
myPlotFunc thx以获取建议。我真的不明白为什么lappy
的结果应该分配给on.exit
调用中的foo
,我不知道在on.exit()调用过程中打印了什么。我这样做基本上是为了阻止在脚本末尾打印关闭的设备名称。这就是它所做的一切,因为只要on.exit()
完成,就会丢弃foo
。好建议,我没有想到这一点。看起来比我的解决方案更干净。+1个很好的解决方案,是迄今为止提供的最干净的解决方案,对现有设备的副作用最少(无)!非常狡猾。最好将1:length(x)
更改为seq_(x)
,以避免x
长度为0时出现问题。@Richie说得很好。我正在考虑使用mappy
并将其更改为if(length(x))mappy(plot_one,x,fnames,save)else警告(“x的长度为0”)
。
myPlotFunc <- function(x,save=F){
fnames <- paste(names(x),"pdf",sep=".")
devs <- NULL
on.exit(for(i in devs) dev.off(i), add=T)
for(i in 1:length(x)){
if(save){
pdf(fnames[i])
devs <- c(devs,dev.cur())
}
plot(x[[i]])
}
fnames
}
myPlotFunc <- function(x,save = FALSE) {
fnames <- paste(names(x),"pdf",sep=".")
if(save)
on.exit(graphics.off(),add = TRUE)
for(i in 1:length(x)) {
if(save) {
pdf(fnames[i])
}
plot(x[[i]])
}
fnames
}
myPlotFunc2 <- function(x,save = FALSE) {
fnames <- paste(names(x), "pdf", sep=".")
if(save) {
on.exit(foo <- lapply(dev.list()[grepl("pdf", names(dev.list()))],
dev.off),
add = TRUE)
}
for(i in 1:length(x)) {
if(save) {
pdf(fnames[i])
}
plot(x[[i]])
}
fnames
}
myPlotFunc <- function(x, save=FALSE) {
fnames <- paste(names(x), "pdf", sep=".")
plot_one <- function(xx, fname, save=save) {
if (save) {
pdf(fname)
on.exit(dev.off())
}
plot(xx)
}
for (i in 1:length(x)) plot_one(x[[i]], fnames[i], save)
fnames
}