如何避免硬编码文件路径?

时间:2016-07-29 02:12:45

标签: r knitr

我正在使用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 repo并运行分析文件。 共享目录路径被硬编码到我的机器上,这是我为帮助解决问题所写的问题。

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文件,该文件包含Word文件的文本,并引用\Sexpr{}中包含的R对象:

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

这对我来说很好。每当我编织.Rnw文件时,它都会抓取我的同事编辑的.docx文件的最新版本(包括跟踪更改和注释),并在稍后的步骤中未显示,返回{{ 1}}文件到共享文件夹。

要解决的问题

除了初始.pdf命令硬编码到我的机器外,此设置几乎满足了我的所有需求。因此,如果我的小组中有人克隆了我的回购(例如,使用版本控制的研究助理),它就不会开箱即用。在这种情况下是否有硬编码的解决方法?

1 个答案:

答案 0 :(得分:2)

最终,您无法绕过您无法控制的硬编码路径,例如网络共享路径。

相反,将它们分配给配置文件和/或环境变量(同样,它们将由配置文件控制,与.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)