2016-07-29 142 views
3

我正在使用RStudio编织一个.Rnw文件。 pdf。此.Rnw文件存储在git版本控制下的目录中。该目录还包含该项目的.RProj文件。如何避免硬编码文件路径?

我与不了解.Rnw文件和git的第一件事的同事合作。这些同事想要打开一个Word文件并跟踪改变他们的心。所以我给了他们想要的东西。

每个人都需要访问权限,因此将Word文件存储在像Box这样的云服务上很有意义。在过去,我在我的回购库中创建了一个子文件夹,用于共享 - 将所有内容都保存在根目录中 - 但是这次我需要将文件存储在其他人创建的共享文件夹中。所以我的解决方案是将这个共享目录中的Word文件复制到我的存储库中。

技术途径

我不知道如何使这个可重复的问题,但我希望你能给我一定的自由度,因为我试图让我的工作完全可重复;)

假设我的.Rnw文件存储在repoRoot/subfolder中。由于knitr将工作目录更改为subfolder,其中此.Rnw文件所在的位置,第一个块将root.dir设置在项目根目录的上一级。

<<knitr, include=FALSE>>= 
    library(knitr) 
    opts_knit$set(root.dir=normalizePath('../')) # go up 1 level 
@ 

下一个块将Word文件从共享文件夹复制到我的git仓库并运行分析文件。 共享目录路径硬编码到我的机器,这是我写的帮助解决的问题。

file.copy(from='/Users/ericpgreen/Box Sync/Project/Paper/draft.docx', 
      to='subfolder/draft.docx', # my repo 
      overwrite=TRUE) 
source(scripts/analysis.R) # generates objects we reference in the .docx file 

加入\begin{document}后,我包括一大块,我的.docx文件转换为.txt,然后将其重命名为.Rnw

# convert docx to txt 
    system("textutil -convert txt 'subfolder/draft.docx'") 
# rename txt to .Rnw 
    file.rename('subfolder/draft.txt', 
       'subfolder/draft.Rnw') 

下一个子块调用这个.Rnw文件,其中包含与于R对象的引用Word文件的文本通过\Sexpr{}包括:

<<include-draft, child='draft.Rnw', include=FALSE>>= 
@ 

这只是正常的我。每当我编织.Rnw文件时,它抓住我的同事已编辑过的.docx文件的最新版本(完成了音轨更改和评论),并在稍后未示出的步骤中将.pdf文件返回到共享文件夹。

解决的问题

此设置满足几乎所有需要我,除了初始file.copy()命令是硬编码到我的机器。因此,如果我的团队中的某个人克隆了我的回购(例如,使用版本控制的研究助理),它将不会用完。在这种情况下是否有硬编码的解决方法?

+0

使用'tempdir()'和'tempfile()'并要求用户从临时目录复制内容。如果你想要一个特定的目录作为临时目录,'tempfile()'中的'tmpdir'参数允许你控制位置。 – Sathish

回答

1

最终,您将无法绕过不受您控制的硬编码路径,例如网络共享路径。你可以应该避免在您的文档中硬编码这些路径。

取而代之的是,将它们归类到配置文件和/或环境变量(它们将再次由配置文件控制,以及.bashrc等)。最简单的方法是使用

network_share_path = Sys.getenv('NETWORK_SHARE_PATH', 
           stop('no network share path configured')) 
file.copy(from = network_share_path, to = 'subfolder/draft.docx', overwrite = TRUE)