presentaciones - Diferencia: botón "Compilar PDF" en RStudio vs. knit() y knit2pdf()
rstudio latex (1)
En primer lugar, creo que esta pregunta es más fácil de responder si limita el alcance al botón "Compilar PDF", porque el botón "Knit HTML" es una historia diferente. "Compilar PDF" es solo para documentos Rnw (R + LaTeX, o piense en Sweave).
Contestaré su pregunta siguiendo los tres puntos que sugirió:
-
Actualmente, RStudio siempre inicia una nueva sesión R para compilar documentos Rnw, y primero cambia el directorio de trabajo al directorio del archivo Rnw. Puedes imaginar el proceso como un script de shell como este:
cd path/to/your-Rnw-directory Rscript -e "library(knitr); knit(''your.Rnw'')" pdflatex your.tex
Tenga en cuenta que el paquete knitr siempre está adjunto, y
pdflatex
puede ser otros motores LaTeX (dependiendo de sus configuraciones de RStudio para documentos Sweave, por ejemplo,xelatex
). Si desea replicarlo en su sesión R actual, puede reescribir el script en R:owd = setwd("path/to/your-Rnw-directory") system2("Rscript", c("-e", shQuote("library(knitr); knit(''your.Rnw'')")) system2("pdflatex", "your.tex") setwd(owd)
que no es tan simple como
knitr::knit(''path/to/your.Rnw'')
, en cuyo caso el directorio de trabajo no cambia automáticamente y todo se ejecuta en la sesión R actual (englobalenv()
por defecto ) -
Debido a que el documento Rnw siempre se compila en una nueva sesión R, no utilizará ningún objeto en su sesión R actual. Esto es difícil de replicar solo a través del argumento
knitr::knit()
deknitr::knit()
en la sesión actual de R. En particular, no puede usarknitr::knit(envir = new.env())
porque aunquenew.env()
es un entorno nuevo, tiene un entorno padre predeterminadoparent.frame()
, que generalmente esglobalenv()
; tampoco puede usarknitr::knit(envir = emptyenv())
, porque es "demasiado limpio" y tendrá problemas con los objetos incluso en el paquete base R. La única forma confiable de replicar lo que hace el botón "Compilar PDF" es lo que dije en 1:system2("Rscript", c("-e", shQuote("library(knitr); knit(''your.Rnw'')"))
, en cuyo casoknit()
usa elglobalenv()
de una nueva sesión R. -
No estoy completamente seguro de lo que hace RStudio para la opción de
repos
. Probablemente configura automáticamente esta opción detrás de escena si no está configurada. Creo que este es un problema relativamente menor. Puede configurarlo en su.Rprofile
, y creo que RStudio debería respetar su configuración de espejo CRAN.
Los usuarios siempre se han preguntado por qué el documento Rnw (o los documentos R Markdown) no se compilan en la sesión R actual. Para nosotros, básicamente se reduce a cuál de las siguientes consecuencias es más sorprendente o no deseada:
- Si tejemos un documento en la sesión R actual, no hay garantía de que sus resultados puedan reproducirse en otra sesión R (por ejemplo, la próxima vez que abra RStudio, o sus colaboradores abran RStudio en sus computadoras).
- Si tejemos un documento en una nueva sesión de R, los usuarios pueden sorprenderse de que no se encuentren objetos (y cuando escriben los nombres de los objetos en la consola de R, pueden verlos). Esto puede ser sorprendente, pero también es un buen recordatorio de que su documento probablemente no funcionará la próxima vez.
Para resumir, pienso:
-
Tejer en una nueva sesión de R es mejor para la reproducibilidad;
-
El tejido en la sesión R actual es a veces más conveniente (por ejemplo, intenta tejer con diferentes objetos R temporales en la sesión actual). A veces también debe tejer en la sesión R actual, especialmente cuando genera informes PDF mediante programación, por ejemplo, utiliza un bucle (for) para generar una serie de informes. No hay forma de que pueda lograr esto solo a través del botón "Compilar PDF" (el botón es principalmente para un solo documento Rnw).
Por cierto, creo que lo que dije anteriormente también puede aplicarse a los botones Knit o Knit HTML, pero la función subyacente es
rmarkdown::render()
lugar de
knitr::knit()
.
TL; DR
¿Cuáles son los efectos secundarios (posiblemente no deseados) del uso de
knit()
/
knit2pdf()
lugar del botón "Compilar PDF"
1
en RStudio?
Motivación
La mayoría de los usuarios de
knitr
parecen escribir sus documentos en RStudio y compilarlos usando el botón "Compilar PDF" / "Knit HTML".
Esto funciona sin problemas la mayor parte del tiempo, pero de vez en cuando hay requisitos especiales que no se pueden lograr con el botón de compilación.
En estos casos, la solución suele ser llamar directamente a
knit()
/
knit2pdf()
/
rmarkdown::render()
(o funciones similares).
Algunos ejemplos:
- ¿Cómo tejer / Sweave a un nombre de archivo diferente?
- ¿Hay alguna manera de hacer un punto de rebaja directamente de su espacio de trabajo usando RStudio?
- Inserte la fecha en el nombre del archivo al tejer el documento con el botón RStudio Knit
El uso de
knit2pdf()
lugar del botón "Compilar PDF" generalmente ofrece una solución simple para tales preguntas.
Sin embargo, esto tiene un precio: existe la diferencia fundamental de que "Compilar PDF" procesa el documento
en un proceso y entorno separados,
mientras que
knit2pdf()
y sus amigos no.
Esto tiene implicaciones y el problema es que no todas estas implicaciones son obvias.
Tome el hecho de que
knit()
usa objetos del entorno global (mientras que "Compilar PDF" no) como ejemplo.
Esto puede ser obvio y el comportamiento deseado en casos como el segundo ejemplo anterior, pero es una
consecuencia inesperada
cuando
knit()
se usa para superar problemas como en los ejemplos 1 y 3.
Además, hay diferencias más sutiles:
- El directorio de trabajo podría no estar configurado como se esperaba.
- Los paquetes deben ser cargados .
- Algunas opciones que usualmente establece RStudio pueden tener valores inesperados .
La pregunta y su objetivo
Cada vez que leo / escribo el consejo para usar
knit2pdf()
lugar de "Compilar PDF", pienso
"correcto, pero el usuario debe entender las consecuencias ..."
.
Por lo tanto, la pregunta aquí es:
¿Cuáles son los efectos secundarios (posiblemente no deseados) del uso de
knit()
/knit2pdf()
lugar del botón "Compilar PDF" en RStudio?
Si hubiera una respuesta integral (¿wiki de la comunidad?) A esta pregunta, se podría vincular en futuras respuestas que sugieran utilizar
knit2pdf()
.
preguntas relacionadas
Hay docenas de preguntas relacionadas con esta. Sin embargo, proponen solo código para (más o menos) reproducir el comportamiento del botón RStudio o explican qué sucede "básicamente" sin mencionar las posibles dificultades. Otros parecen ser preguntas muy similares, pero resultan ser un caso (muy) especial. Algunos ejemplos:
- Knit2html no replica la funcionalidad del botón Knit HTML en R Studio : problema de almacenamiento en caché.
- Las salidas HTML son diferentes entre usar knitr en Rstudio y knit2html en la línea de comando : versiones de Markdown.
-
¿Cómo convertir R Markdown a HTML?
Es decir, ¿qué hace "Knit HTML" en Rstudio 0.96?
: Respuesta bastante superficial de Yihui (explica qué sucede "básicamente") y algunas opciones sobre cómo reproducir el comportamiento del botón RStudio.
Ni el
Sys.sleep(30)
suggestedSys.sleep(30)
ni el registro "Compilar PDF" son reveladores (ambas sugerencias apuntan a lo mismo). - ¿Qué hace "Knit HTML" en Rstudio 0.98? : Reproduce el comportamiento del botón.
Sobre la respuesta
Creo que esta pregunta planteó muchos de los problemas que deberían ser parte de una respuesta. Sin embargo, puede haber muchos más aspectos que no conozco, y esta es la razón por la que soy reacio a responder esta pregunta (aunque podría intentarlo si nadie responde).
Probablemente, una respuesta debería cubrir tres puntos principales:
- El nuevo problema de sesión versus sesión actual (opciones globales, directorio de trabajo, paquetes cargados, ...).
-
Una consecuencia del primer punto: el hecho de que
knit()
usa objetos del entorno de llamada (predeterminado:envir = parent.frame()
) e implicaciones para la reproducibilidad. Traté de abordar el problema de evitar queknit()
use objetos externos al documento en esta respuesta (segundo punto). -
Cosas que RStudio hace en secreto ...
- … Al iniciar una sesión interactiva ( example ) -> No disponible al presionar "Compilar PDF"
- … Al presionar "Compilar PDF" (¿hay algo especial además de la nueva sesión con el directorio de trabajo configurado en el archivo procesado?)
No estoy seguro de la perspectiva correcta sobre el tema.
Creo que tanto "Lo que sucede cuando presiono ''Compilar PDF'' + implicaciones" como "Lo que sucede cuando uso
knit()
implicaciones de
knit()
+" es un buen enfoque para abordar la cuestión.
1 Lo mismo se aplica al botón "Knit HTML" al escribir documentos RMD.