tutorial studio presentaciones don chunk r rstudio knitr

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ó:

  1. 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 (en globalenv() por defecto )

  2. 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() de knitr::knit() en la sesión actual de R. En particular, no puede usar knitr::knit(envir = new.env()) porque aunque new.env() es un entorno nuevo, tiene un entorno padre predeterminado parent.frame() , que generalmente es globalenv() ; tampoco puede usar knitr::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 caso knit() usa el globalenv() de una nueva sesión R.

  3. 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:

  1. 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).
  2. 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:

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:

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:

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 que knit() 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.