首先,如果您将范围限制为"编译PDF"按钮,我认为这个问题更容易回答,因为"编织HTML"按钮是一个不同的故事."编译PDF"仅适用于Rnw文档(R + LaTeX,或者认为Sweave).
我会按照你提出的三点回答你的问题:
目前,RStudio总是启动一个新的R会话来编译Rnw文件,并首先将工作目录更改为Rnw文件的目录.您可以将该过程想象为这样的shell脚本:
cd path/to/your-Rnw-directory Rscript -e "library(knitr); knit('your.Rnw')" pdflatex your.tex
请注意,knitr包始终是附加的,pdflatex
可能是其他LaTeX引擎(取决于您对Sweave文档的RStudio配置,例如xelatex
).如果要在当前的R会话中复制它,可以在R中重写脚本:
owd = setwd("path/to/your-Rnw-directory") system2("Rscript", c("-e", shQuote("library(knitr); knit('your.Rnw')")) system2("pdflatex", "your.tex") setwd(owd)
这并不简单knitr::knit('path/to/your.Rnw')
,在这种情况下,工作目录不会自动更改,并且所有内容都在当前R会话中执行globalenv()
(默认情况下).
由于Rnw文档始终在新的R会话中编译,因此它不会使用当前R会话中的任何对象.这很难通过当前R会话中的envir
参数来复制knitr::knit()
.特别是,您无法使用,knitr::knit(envir = new.env())
因为虽然它new.env()
是一个新环境,但它有一个默认的父环境parent.frame()
,通常是globalenv()
; 你也不能使用knitr::knit(envir = emptyenv())
,因为它太"干净"了,即使在R base包中你也会遇到问题.复制"编译PDF"按钮的唯一可靠方法是我在1中所说的:system2("Rscript", c("-e", shQuote("library(knitr); knit('your.Rnw')"))
在这种情况下knit()
使用globalenv()
新的R会话.
我不完全确定RStudio对该repos
选项的作用.如果未设置,它可能会在幕后自动设置此选项.我认为这是一个相对较小的问题.你可以在你的设置中设置它.Rprofile
,我认为RStudio应该尊重你的CRAN镜像设置.
用户一直在问为什么Rnw文档(或R Markdown文档)没有在当前的R会话中编译.对我们来说,它基本上归结为以下哪种后果更令人惊讶或不受欢迎:
如果我们在当前的R会话中编织文档,则无法保证您的结果可以在另一个R会话中重现(例如,下次打开RStudio时,或者您的协作者在其计算机上打开RStudio).
如果我们在新的R会话中编织文档,用户可能会惊讶于找不到对象(当他们在R控制台中键入对象名称时,他们可以看到它们).这可能会令人惊讶,但它也是一个很好的早期提醒,您的文档可能在下次无法运行.
总结一下,我想:
在新的R会话中编织对于再现性更好;
在当前R会话中编织有时更方便(例如,您尝试在当前会话中使用不同的临时R对象编织).有时你还必须编织当前的R会话,特别是当你以编程方式生成PDF报告时,例如,你使用(for)循环来生成一系列报告.您无法通过"编译PDF"按钮实现此目的(该按钮主要用于单个Rnw文档).
顺便说一句,我认为我上面所说的也可以应用于Knit或Knit HTML按钮,但基础功能rmarkdown::render()
不是knitr::knit()
.
首先,如果您将范围限制为"编译PDF"按钮,我认为这个问题更容易回答,因为"编织HTML"按钮是一个不同的故事."编译PDF"仅适用于Rnw文档(R + LaTeX,或者认为Sweave).
我会按照你提出的三点回答你的问题:
目前,RStudio总是启动一个新的R会话来编译Rnw文件,并首先将工作目录更改为Rnw文件的目录.您可以将该过程想象为这样的shell脚本:
cd path/to/your-Rnw-directory Rscript -e "library(knitr); knit('your.Rnw')" pdflatex your.tex
请注意,knitr包始终是附加的,pdflatex
可能是其他LaTeX引擎(取决于您对Sweave文档的RStudio配置,例如xelatex
).如果要在当前的R会话中复制它,可以在R中重写脚本:
owd = setwd("path/to/your-Rnw-directory") system2("Rscript", c("-e", shQuote("library(knitr); knit('your.Rnw')")) system2("pdflatex", "your.tex") setwd(owd)
这并不简单knitr::knit('path/to/your.Rnw')
,在这种情况下,工作目录不会自动更改,并且所有内容都在当前R会话中执行globalenv()
(默认情况下).
由于Rnw文档始终在新的R会话中编译,因此它不会使用当前R会话中的任何对象.这很难通过当前R会话中的envir
参数来复制knitr::knit()
.特别是,您无法使用,knitr::knit(envir = new.env())
因为虽然它new.env()
是一个新环境,但它有一个默认的父环境parent.frame()
,通常是globalenv()
; 你也不能使用knitr::knit(envir = emptyenv())
,因为它太"干净"了,即使在R base包中你也会遇到问题.复制"编译PDF"按钮的唯一可靠方法是我在1中所说的:system2("Rscript", c("-e", shQuote("library(knitr); knit('your.Rnw')"))
在这种情况下knit()
使用globalenv()
新的R会话.
我不完全确定RStudio对该repos
选项的作用.如果未设置,它可能会在幕后自动设置此选项.我认为这是一个相对较小的问题.你可以在你的设置中设置它.Rprofile
,我认为RStudio应该尊重你的CRAN镜像设置.
用户一直在问为什么Rnw文档(或R Markdown文档)没有在当前的R会话中编译.对我们来说,它基本上归结为以下哪种后果更令人惊讶或不受欢迎:
如果我们在当前的R会话中编织文档,则无法保证您的结果可以在另一个R会话中重现(例如,下次打开RStudio时,或者您的协作者在其计算机上打开RStudio).
如果我们在新的R会话中编织文档,用户可能会惊讶于找不到对象(当他们在R控制台中键入对象名称时,他们可以看到它们).这可能会令人惊讶,但它也是一个很好的早期提醒,您的文档可能在下次无法运行.
总结一下,我想:
在新的R会话中编织对于再现性更好;
在当前R会话中编织有时更方便(例如,您尝试在当前会话中使用不同的临时R对象编织).有时你还必须编织当前的R会话,特别是当你以编程方式生成PDF报告时,例如,你使用(for)循环来生成一系列报告.您无法通过"编译PDF"按钮实现此目的(该按钮主要用于单个Rnw文档).
顺便说一句,我认为我上面所说的也可以应用于Knit或Knit HTML按钮,但基础功能rmarkdown::render()
不是knitr::knit()
.