我一直在研究一个我希望交给同事的R项目(projectA),在脚本中处理工作区引用的最佳方法是什么?为了说明,假设projectA由几个R脚本组成,每个脚本读取输入并将输出写入某些目录(dirs)。所有目录都包含在我当地的保管箱内。脚本的I / O部分如下所示:
# Script 1.
# Give input and output names and dirs:
dat1Dir <- "D:/Dropbox/ProjectA/source1/"
dat1In <- "foo1.asc"
dat2Dir <- "D:/Dropbox/ProjectA/source2/"
dat2In <- "foo2.asc"
outDir <- "D:/Dropbox/ProjectA/output1/"
outName <- "fooOut1.asc"
# Read data
setwd(dat1Dir)
dat1 <- read.table(dat1In)
setwd(dat2Dir)
dat2 <- read.table(dat2In)
# do stuff with dat1 and dat2 that result in new data foo
# Write new data foo to file
setwd(outDir)
write.table(foo, outName)
# Script 2.
# Give input and output names and dirs
dat1Dir <- "D:/Dropbox/ProjectA/output1/"
dat1In <- "fooOut1.asc"
outDir <- "D:/Dropbox/ProjectA/output2/"
outName <- "fooOut2.asc"
等。每个脚本从/向文件读取和写入数据,后续脚本读取先前脚本的输出。问题是:如何确保目录字符串在转移给其他用户后仍然有效?
假设我们将ProjectA文件夹(包括子文件夹)复制到另一台PC,并将其存储在例如C:/ Users / foo / my documents /中。理想情况下,我会有一个函数FindDir()
找到项目中最低公用文件夹的位置,这里是“ProjectA”,这样我就可以用以下内容替换每个目录字符串:
dat1Dir <- paste(FindDir(), "ProjectA/source1", sep= "")
那样:
# At my own PC
dat1Dir <- paste(FindDir(), "ProjectA/source1", sep= "")
> "D:/Dropbox/ProjectA/source1/"
# At my colleagues PC
dat1Dir <- paste(FindDir(), "ProjectA/source1", sep= "")
> "C:Users/foo/my documents/ProjectA/source1/"
或者也许有不同的方式?我们的工作IT基础架构目前不允许使用共享光盘。我将帮助函数放在'官方'R项目中(即托管在R forge上),但是我想在需要许多I / O参数时使用脚本,因为代码可以很容易地被查看并评论道。
非常感谢提前!
答案 0 :(得分:2)
您应该可以使用相对目录路径来执行此操作。这就是我为Dropbox中的R项目所做的工作,我在我的Windows和OS X机器上编辑/运行Dropbox文件夹分别为D:/Dropbox
和/Users/robin/Dropbox
。
要做到这一点,你需要
使用setwd('/Users/robin/Dropbox;)
(请参阅full docs for that command)在R中设置当前工作目录(在脚本的第一行,或在运行前以交互方式在控制台上设置)。
将路径更改为相对路径,这意味着它们只有当前目录中的路径位,在这种情况下,如果您设置了'ProjectA/source1'
位您当前目录到Dropbox文件夹,或者只是'source1'
如果您已将当前目录设置为ProjectA文件夹(这是一个更好的主意)。
然后一切都应该有用!
你可能也对我称之为ProjectTemplate的R库感兴趣 - 它为你提供了非常好的功能,可以在R中为这种工作制作自包含项目,并且它们完全可重复,可移动计算机之间等等。我写了introductory blog post这可能很有用。