使用packrat库与knitr和rstudio编译PDF按钮

4
如Yihui Xie在此文中所解释的那样,当使用RStudio IDE的Compile PDF按钮从.Rnw文件生成PDF时,knit()会使用新的R会话的globalenv()。有没有办法让这个新的R会话使用我的项目的packrat库(甚至包括我packrat库中包含的knitr版本),而不是我的个人用户库,以确保最高程度的可重复性?我猜想新的R会话必须与项目本身链接起来,但我不知道如何高效地做到这一点。
我知道我可以直接使用knit()函数而不是Compile PDF按钮,这样knit()会使用我的当前globalenv(),但我不喜欢这个解决方案,因为它不太具有可重复性。
2个回答

3
我认为我已经解决了问题,但我想与其他人分享并确认我的正确性,并可能帮助改进我的解决方案。我的具体问题是,我的.Rnw文件位于整个项目的子目录中。当编译PDF按钮创建一个新的R会话时,它会在这个子目录中创建,因此找不到初始化packrat的.Rprofile文件。我认为最简单的解决方法是在我的子目录中创建一个包含以下内容的.Rprofile文件:
temp <- getwd()
setwd("..")
source("packrat/init.R")
setwd(temp)
rm(temp)

在执行source("packrat/init.R")之前,我需要在项目级别更改工作目录,因为该文件本身引用了该目录...

有没有人能提供更好的解决方案?


0

P.,

我不确定这个解决方法是否适用于knitr包,但我99%肯定它对所有其他包都适用,因为它对我来说似乎是这样的。

(我相信)我有一个非常相似的问题。我有我的项目文件夹,但我的工作目录始终是我的.rnw文件所在的子文件夹,位于我的项目文件夹的子目录中。

链接到谢益辉的答案非常有帮助。

最初我想要一个像这样的项目文件夹:

project-a/
               working/
                        data/
                                  datas.csv
                        analysis/
                                  library.R
                                  rscripts.R
                        rnw/
                                  report.rnw
                        child/
                                  preamble.rnw
                        packrat/

但我不确定如果我的R library()调用不在工作目录中,是否可以使用packrat实现,并且packrat无法解析 .rnw 文件(我从一个块中使用source()调用 library.R 文件,其在我的.rnw文件中)。一些注意事项:

  • 我想使用一个.Rproj文件来打开项目,并将project-a/working作为工作目录
    • 如果是这样的话,packrat可以找到library.R脚本
    • 但是.rnw文件在编译时仍然默认为自己的工作目录
  • 我认为使用knitr::opts_knit$set(root.dir = "..").Rprofile会起作用,但我不认为它适用于像input\这样的latex命令,它会默认返回包含.rnw文件的目录
    • 我认为这是不够的,因为你有两个工作目录,一个用于你的r chunks,另一个用于你的latex!

由于.rnw总是设置工作目录,因此我将我的library.R脚本放在与我的.rnw文件相同的目录中,该目录创建了project-a/working/rnw中的packrat文件夹。 我99%确定这有效,因为当我在project-a/working/rnw文件夹中创建packrat文件夹时,没有重新定位library.R文件,它会收到找不到任何软件包的错误,我无法编译.rnw文件。

project-a/
               working/
                        data/
                                  datas.csv
                        analysis/
                                  rscripts.R
                        rnw/
                                  report.rnw
                                  library.R
                                  packrat/
                        child/
                                  preamble.rnw

再次强调,除非我忽略了什么或者误解了使用的软件包,否则这对我来说似乎是有效的。在此声明,我相对于packrat还比较新手。


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