Ответ 1
Прежде всего, я думаю, что на этот вопрос легче ответить, если вы ограничите область действия кнопкой "Компилировать PDF", потому что кнопка "Вязать HTML" - это отдельная история. "Компилировать PDF" предназначен только для документов Rnw (R + LaTeX, или, кажется, Sweave).
Я отвечу на ваш вопрос, следуя трем пунктам, которые вы предложили:
-
В настоящее время RStudio всегда запускает новый сеанс R для компиляции документов Rnw и сначала меняет рабочий каталог на каталог файла Rnw. Вы можете представить процесс в виде сценария оболочки следующим образом:
cd path/to/your-Rnw-directory Rscript -e "library(knitr); knit('your.Rnw')" pdflatex your.tex
Обратите внимание, что пакет knitr всегда подключен, и
pdflatex
может быть другими механизмами LaTeX (в зависимости от ваших конфигураций RStudio для документов Sweave, например,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')
, в этом случае рабочий каталог не изменяется автоматически, и все выполняется в текущем сеансе Rglobalenv()
по умолчанию вglobalenv()
). -
Поскольку документ Rnw всегда компилируется в новом сеансе R, он не будет использовать никаких объектов в текущем сеансе R. Это трудно повторить только через
envir
аргументknitr::knit()
в текущей сессии R. В частности, вы не можете использоватьknitr::knit(envir = new.env())
потому что хотяnew.env()
является новой средой, она имеет родительскую среду по умолчаниюparent.frame()
, которая обычно являетсяglobalenv()
; вы также не можете использоватьknitr::knit(envir = emptyenv())
, потому что он "слишком чистый", и у вас будут проблемы с объектами даже в базовом пакете R. Единственный надежный способ воспроизвести действия кнопки "Компилировать 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()
.