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