使用file.exists()来测试目录的存在是原始帖子中的一个问题 . 如果subDir包含现有文件的名称(而不仅仅是路径),则file.exists()将返回TRUE,但是对setwd()的调用将失败,因为您无法将工作目录设置为指向文件 .
我建议使用file_test(op =“ - d”,subDir),如果subDir是现有目录,则返回“TRUE”,但如果subDir是现有文件或不存在的文件或目录,则返回FALSE . 同样,可以使用op =“ - f”来检查文件 .
此外,如另一条评论中所述,工作目录是R环境的一部分,应由用户控制,而不是脚本 . 理想情况下,脚本应该不会改变R环境 . 为了解决这个问题,我可能会使用options()来存储一个全局可用的目录,我想要所有的输出 .
因此,请考虑以下解决方案,其中someUniqueTag只是程序员定义的选项名称前缀,这使得不太可能存在具有相同名称的选项 . (例如,如果您正在开发名为“filer”的包,则可以使用filer.mainDir和filer.subDir) .
以下代码将用于设置稍后可在其他脚本中使用的选项(从而避免在脚本中使用setwd()),并在必要时创建文件夹:
mainDir = "c:/path/to/main/dir"
subDir = "outputDirectory"
options(someUniqueTag.mainDir = mainDir)
options(someUniqueTag.subDir = "subDir")
if (!file_test("-d", file.path(mainDir, subDir)){
if(file_test("-f", file.path(mainDir, subDir)) {
stop("Path can't be created because a file with that name already exists.")
} else {
dir.create(file.path(mainDir, subDir))
}
}
然后,在需要操作subDir中的文件的任何后续脚本中,您可能会使用以下内容:
mainDir = getOption(someUniqueTag.mainDir)
subDir = getOption(someUniqueTag.subDir)
filename = "fileToBeCreated.txt"
file.create(file.path(mainDir, subDir, filename))
此解决方案使工作目录处于用户的控制之下 .