项目转移后保留有效的工作区参考。

时间:2013-12-10 10:19:28

标签: r project directory-structure project-organization

我一直在研究一个我希望交给同事的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参数时使用脚本,因为代码可以很容易地被查看并评论道。

非常感谢提前!

1 个答案:

答案 0 :(得分:2)

您应该可以使用相对目录路径来执行此操作。这就是我为Dropbox中的R项目所做的工作,我在我的Windows和OS X机器上编辑/运行Dropbox文件夹分别为D:/Dropbox/Users/robin/Dropbox

要做到这一点,你需要

  1. 使用setwd('/Users/robin/Dropbox;)(请参阅full docs for that command)在R中设置当前工作目录(在脚本的第一行,或在运行前以交互方式在控制台上设置)。

  2. 将路径更改为相对路径,这意味着它们只有当前目录中的路径位,在这种情况下,如果您设置了'ProjectA/source1'位您当前目录到Dropbox文件夹,或者只是'source1'如果您已将当前目录设置为ProjectA文件夹(这是一个更好的主意)。

  3. 然后一切都应该有用!

    你可能也对我称之为ProjectTemplate的R库感兴趣 - 它为你提供了非常好的功能,可以在R中为这种工作制作自包含项目,并且它们完全可重复,可移动计算机之间等等。我写了introductory blog post这可能很有用。