gpt4 book ai didi

r - 阻止 R 覆盖图形文件

转载 作者:行者123 更新时间:2023-12-02 04:54:55 27 4
gpt4 key购买 nike

我在 iPad 上以批处理模式使用 R,并将图形文件放在 ~/Dropbox 中,并在那里查看它们。当我连续运行 R session 时,它会覆盖上一次运行生成的图形文件,即使我使用

png(filename="Rplot%03d.png")

是否有可能让 R 继续递增文件名?例如,如果我有 Rplot001.pngRplot005.png 我希望下一个文件进入 Rplot006.png

我知道可以使用 paste()png() 调用创建一个随机前缀,但我想使用特定的方式命名它们我正在做的项目。

谢谢

最佳答案

您可以检测到最新的文件,并从那里递增。像这样的东西:

连续运行

projectPng <- function(projectName, dir, ...) {
# get a list of existing plots for the project
plots <- list.files(path=dir, pattern=paste0(projectName, "*.png"))
# pull out numeric component of the plot files
nums <- as.numeric(gsub(paste("Rplots", ".png", sep="|"), "", plots))
last <- max(nums)
# Create a new file name with an incremented counter.
newFile <- paste0(projectName, sprintf("%03d", last + 1), ".png")
# now call png
png(file.path(dir, newFile), ...)
}

现在 projectPng 将使用项目的下一个递增编号打开一个新设备:

# If Rplots005.png exists, will open Rplots006.png
projectPng("Rplots", "~/Dropbox")

多个并行运行

或者,如果您并行运行多个运行,则可以存储一个全局计数器,以在打开新设备时最大限度地减少每次独立运行的冲突:

projectPng <- function(projectName, dir, ...) {
# Get the most recently opened device number as stored by `projectPng`
counterFile <- file.path(dir, paste0(projectName, "_png_counter.txt")
new <- tryCatch({
last <- scan(file=counterFile, what=integer())
cat(last + 1, "\n", file=counterFile)
return(last + 1)
}, error = function(e) {
# If we're unable to open the counter file, assume no plots exist yet
cat(1, "\n", file=counterFile)
return(1)
})
# Create a new file name with an incremented counter.
newFile <- paste0(projectName, sprintf("%03d", new), ".png")
# now call png
png(file.path(dir, newFile), ...)
}

但是:这不能保证是安全的:如果两个 R session 同时调用 projectPng,它们有可能从counterFile,在另一个有机会递增计数器之前。

关于r - 阻止 R 覆盖图形文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23862306/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com