Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 了解如何读取设备列表_R_Graphics_Device - Fatal编程技术网

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
}