【发布时间】:2011-05-12 03:10:48
【问题描述】:
我经常发现自己编写的 R 脚本会产生大量输出。我发现将此输出放入它自己的目录中会更干净。我在下面写的内容将检查目录是否存在并移入它,或者创建目录然后移入它。有没有更好的方法来解决这个问题?
mainDir <- "c:/path/to/main/dir"
subDir <- "outputDirectory"
if (file.exists(subDir)){
setwd(file.path(mainDir, subDir))
} else {
dir.create(file.path(mainDir, subDir))
setwd(file.path(mainDir, subDir))
}
【问题讨论】:
-
我确定我见过一个 R 函数,它使用随机生成的名称创建一个临时目录并返回该名称。我认为有一个类似的创建临时文件。我找不到它们,但是 Databel 包 (cran.r-project.org/web/packages/DatABEL/index.html) 有一个函数 get_temporary_file_name。
-
你不应该在 R 代码中使用
setwd()- 它基本上违背了使用工作目录的想法,因为你不能再轻松地在计算机之间移动代码。 -
@hadley 有趣的话题值得思考,我很感激你对其他方法的想法。在工作中,所有计算机都同步到同一个网络,因此文件路径是一致的。如果不是这样,我们还有比脚本的可移植性更大的问题要处理。在这个特定的示例中,我正在编写一个脚本,该脚本将加载到一台机器上,该机器将在我们的国家公园周围携带 2 年。该脚本将从本地 SQL 实例中获取数据,进行一些处理,然后输出 .csv。最终产品将是一个
.bat文件,最终用户将永远不必修改。 -
@Marek - 啊,我明白了。所以你是说我应该用类似
write.table(file = "path/to/output/directory", ...)的东西替换我对setwd()的调用? -
是的。或者参数化
out_dir <- "path/to/output/directory",然后使用write.table(file = file.path(out_dir,"table_1.csv"), ...)。甚至是out_file <- function(fnm) file.path("path/to/output/directory", fnm),然后是write.table(file = out_file("table_1.csv"), ...)(我在使用网络驱动器时使用的类似方法)。
标签: r