on.exit的意外行为(...,add = TRUE)

时间:2014-07-22 05:07:08

标签: r

首先,请注意以下代码创建并删除当前目录中的文件夹。如果它与您的任何文件名冲突,请不要运行此代码。如果没有它,我不确定如何解释这个问题。

fun1我在一行上使用on.exit(..., add = TRUE),在下一行中,我尝试删除我用另一个on.exit调用创建的目录。它没有用。

fun1 <- function(){
   if(!file.exists("Rsaber")) dir.create("Rsaber")
   on.exit(file.remove(paste0("Rsaber/", list.files("Rsaber"))), add = TRUE)
   on.exit(file.remove("Rsaber"))
   write.csv("1,2,3,4", file = "Rsaber/new.csv")
}
> fun1()
# Warning message:
# In file.remove("Rsaber") :
#   cannot remove file 'Rsaber', reason 'Directory not empty'
> file.exists("Rsaber")
# [1] TRUE
> list.files("Rsaber")
# [1] "new.csv"

然而,这种方法有效。

fun2 <- function(){
   if(!file.exists("Rsaber")) dir.create("Rsaber")
   on.exit(file.remove(c(paste0("Rsaber/", list.files("Rsaber"))), "Rsaber"))
   write.csv("1,2,3,4", file = "Rsaber/new.csv")
}
> fun2()
> file.exists("Rsaber")
# [1] FALSE

这第二种方法也更清晰,可能还有很长的路要走,但是

为什么 on.exit(..., add = TRUE) fun1中按预期行事?

请注意,此处我没有使用临时目录,因为这是一个较大的函数的一部分,该函数具有用于确定是否保留下载的数据文件的逻辑参数。

系统信息:

> version[[1]]
# [1] "x86_64-pc-linux-gnu"

1 个答案:

答案 0 :(得分:2)

我认为你需要add=TRUE第二个file.remove,否则第二个语句会取代第一个:

fun1 <- function(){
   if(!file.exists("Rsaber")) dir.create("Rsaber")
   on.exit(file.remove(paste0("Rsaber/", list.files("Rsaber"))))
   on.exit(file.remove("Rsaber"), add = TRUE)
   write.csv("1,2,3,4", file = "Rsaber/new.csv")
}

同样如上所述,这不会在Windows上工作,因为目录不会被视为文件。

对于跨平台支持,可以考虑unlink

fun1 <- function(){
  if(!file.exists("Rsaber")) dir.create("Rsaber")
  on.exit(unlink("Rsaber", recursive = TRUE))
  write.csv("1,2,3,4", file = "Rsaber/new.csv")
  print(system('ls'))
}