像png中一样在ggsave中自动为文件编号

时间:2019-02-18 17:12:44

标签: r ggplot2 printf

png()中,第一个参数为filename = "Rplot%03d.png",这将导致文件以升序生成。但是,在ggsave,中这是行不通的,该数字始终保持为最低数字(Rplots001.png“),并且该文件始终被覆盖。

查看grDevices函数的代码(例如grDevices::png(),似乎自动命名发生在.External()调用的函数中

R中是否已经实现了该文件命名功能的实现,以便可以在grDevices函数之外进行访问?

编辑: 提出不同的问题,在关闭并重新启动设备后,是否可以继续自动编号?例如,在此代码中,后两个文件将覆盖前一个文件:

png(width = 100)
plot(1:10)
plot(1:10)
dev.off()
png(width = 1000)
plot(1:10)
plot(1:10)
dev.off()

1 个答案:

答案 0 :(得分:0)

您可以编写一个函数来执行此操作。例如,简单地添加时间戳如何。像这样:

fname = function(basename = 'myfile', fileext = 'png'){
  paste(basename, format(Sys.time(), " %b-%d-%Y %H-%M-%S."), fileext, sep="")
}

ggsave(fname())

或者,如果您更喜欢顺序编号,则遵循

next_file = function(basename = 'myfile', fileext = 'png', filepath = '.'){
  old.fnames = grep(paste0(basename,' \\d+\\.', fileext,'$'), 
    list.files(filepath), value = T)
  lastnum = gsub(paste0(basename,' (\\d+)\\.', fileext,'$'), '\\1', old.fnames)
  if (!length(lastnum)) { 
    lastnum = 1 
  } else {
    lastnum = sort(as.integer(lastnum),T)[1] + 1L 
  }
  return(paste0(basename, ' ', sprintf('%03i', lastnum), '.', fileext))
}

ggsave(next_file())