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

4
我正在使用RStudio将一个.Rnw文件转换为.pdf文件。这个.Rnw文件存储在一个受git版本控制的目录下。该目录还包含一个.RProj项目文件。
我与不懂.Rnw文件和git的同事合作。这些同事想要打开一个Word文件并进行更改跟踪。所以我给了他们想要的东西。
每个人都需要访问,因此将Word文件存储在Box等云服务中是有意义的。过去我在共享的repo中创建了一个子文件夹,将所有内容保留在根目录中,但这一次我需要将文件存储在其他人创建的共享文件夹中。因此,我的解决方案是将Word文件从此共享目录复制到我的repo中。
技术方法:
我不知道如何使这成为可复制的问题,但希望您会给我一些宽限,因为我正在努力使我的工作完全可复制 ;)
假设我的.Rnw文件存储在repoRoot/subfolder中。由于knitr将工作目录更改为存储该.Rnw文件的subfolder,在第一个代码块中,将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')

下一个子块调用这个包含对R对象的引用通过\Sexpr{}的Word文件文本的.Rnw文件:
<<include-draft, child='draft.Rnw', include=FALSE>>=
@

这对我来说很有效。每当我编织.Rnw文件时,它会获取我的同事编辑的最新版本的.docx文件(包括修订和注释),然后在此处未显示的后续步骤中将.pdf文件返回到共享文件夹。

需要解决的问题

这个设置几乎满足了我所有的需求,但是初始的file.copy()命令是硬编码到我的机器上的。因此,如果我的组中的某个人克隆了我的repo(例如,使用版本控制的研究助理),它就不能直接运行。在这种情况下,是否有一种解决方法可以避免硬编码?


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

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接