Pregunta ¿Hay una manera de tener la ejecución del fragmento de rebajas condicionales en Rmarkdown?


Soy un instructor que busca hacer una tarea y una guía de solución de tareas desde el mismo archivo Rmarkdown cambiando un parámetro de documento que creé llamado soln. Cuando soln=FALSE el documento de asignación se genera, y cuando soln=TRUE se genera la guía de solución de tareas. Puedo controlar la ejecución del fragmento del código R usando el parámetro del documento, pero también me gustaría la inclusión condicional del texto de reducción.

Mi solución actual es fea:

---
title: "Homework"
output: word_document
params:
  soln: TRUE
---
Fit the linear regression model $Y \sim X$ with the following data.     
Interpret the coefficient estimates.
```{r promptchunk, include = TRUE, echo = TRUE}
# R code I want to show in the question prompt goes here
# This executes in both assignment and solution versions
set.seed(123)
X <- c(1, 1, 0, 0)
Y <- rnorm(4)
```
```{r, include = params$soln, echo = FALSE, results = "asis"}
cat("
**ANSWER**
")
```
```{r, echo = params$soln, include = params$soln, eval = params$soln}
# R code corresponding to the solution
fit1 <- lm(Y ~ X)
summary(fit1)
```
```{r, include = params$soln, echo = FALSE, eval = params$soln, results = "asis"}
cat("
The interpretation of the intercept is.... 
Our estimate $\\hat{\\beta}_0$ is ",coef(fit1)[1],".
The estimated X coefficient $\\hat{\\beta}_1$ is ",coef(fit1)[2]," 
This can be interpreted as....

You can imagine that for more difficult questions, this section could be quite long.
")
```

Lo que me gustaría hacer es reemplazar los trozos que contienen cat funciones con algo más elegante y legible para la persona que escribe la guía de soluciones. Mi enfoque actual es suficiente para mí, pero no es algo que pueda pedirle a mis compañeros de instrucción que utilicen porque es muy desagradable escribir las soluciones dentro de cat función. (Como usuario de LaTeX, también es molesto necesitar barras dobles para todo dentro de los comandos de matemáticas).

Hay otra manera de hacer esto?


11
2017-09-17 19:12


origen


Respuestas:


En lugar de usar cat para imprimir la solución desde un fragmento de código R, podría escribir la solución como lo haría normalmente en rmarkdown (es decir, con la combinación habitual de texto, latexy fragmentos de código R) y usa el parámetro soln comentar esa sección cuando no desee incluir la solución en el documento final.

En la muestra rmarkdown documentar a continuación, si el parámetro soln es FALSE, entonces la linea r if(!params$soln) {"\\begin{comment}"} inserciones \begin{comment} comentar la solución (con un código coincidente al final para insertar \end{comment}) También he sangrado todo con dos pestañas, de modo que los números de las preguntas se formateen con un sangría. (Si le gusta este formato, no tiene que escribir la doble pestaña para cada nuevo párrafo o fragmento. Si hace esto para una línea, cada vez que presione el botón Enter clave, la nueva línea se formateará automáticamente con la doble pestaña. O simplemente escriba todo su texto y código para una pregunta determinada, luego, cuando haya terminado, resalte todo y escriba tab dos veces.)

---
title: "Homework"
output: word_document
header-includes:
  - \usepackage{comment}
params:
  soln: TRUE
---

1. Fit the linear regression model $Y \sim X$ with the following data. Interpret the coefficient estimates.

    ```{r promptchunk, echo = TRUE}
    set.seed(123)
    X <- c(1, 1, 0, 0)
    Y <- rnorm(4)
    ```

`r if(!params$soln) {"\\begin{comment}"}`

    **Solution:**

    Run the following R code to fit the linear regression model:
    ```{r, include = params$soln, echo = TRUE, results = "asis"}
    fit1 = lm(Y ~ X)
    ```

    To see a summary of the regression results, run the following code and review the output: 

    ```{r, include = params$soln, echo=TRUE}
    summary(fit1)
    ```
    The interpretation of the intercept is.... 

    Our estimate $\hat{\beta}_0$ is `r round(coef(fit1)[1], 2)`.

    The estimated X coefficient $\hat{\beta}_1$ is `r round(coef(fit1)[2], 2)`. 

    This can be interpreted as....

`r if(!params$soln) {"\\end{comment}"}`

Además, en lugar de tejer el archivo de manera interactiva, puede representar ambas versiones ejecutando el render función en un guión R separado. Por ejemplo, suponiendo que se llame al archivo de arriba hw.Rmd, abra un archivo de script R separado y ejecute lo siguiente:

for (i in c(TRUE, FALSE)) {
  rmarkdown::render("hw.Rmd", 
                    params = list(soln = i),
                    output_file=ifelse(i, "Solutions.doc", "Homework.doc"))
}

A continuación es lo que Solutions.doc parece. Homework.doc es similar, excepto todo lo relacionado con la palabra en negrita Solution: en adelante está excluido:

enter image description here


16
2017-09-17 21:46



Pude construir fuera esta respuesta para hacer algo que no usa un paquete de látex (aunque estoy generando diapositivas HTML, así que esa podría ser la razón por la que esto funciona).

Donde quiera que comience el comentario, simplemente agregue: `r if(params$soln) {"<!--"}`

Y luego agregue esto para finalizar el comentario: `r if(params$soln) {"-->"}`

Esto no requirió que editara ninguno de los bloques de código contenidos para la ejecución condicional ni nada por el estilo. ¡Espero que esto ayude a alguien!


1
2018-04-23 20:14