thatssobayesic - 8 months ago 70

Markdown Question

I am an instructor looking to make a homework assignment and homework solution guide from the same Rmarkdown file by changing a document parameter I created called

`soln`

`soln=FALSE`

`soln=TRUE`

My current workaround is ugly:

`---`

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.

")

```

What I would like to do is to replace the chunks containing

`cat`

`cat`

Is there another way to do this?

Answer

Instead of using `cat`

to print the solution from within an R code chunk, you could write the solution as you usually would in `rmarkdown`

(i.e., with the usual combination of text, `latex`

, and R code chunks), and use the parameter `soln`

to comment out that section when you don't want to include the solution in the final document.

In the sample `rmarkdown`

document below, if the parameter `soln`

is `FALSE`

, then the line `r if(!params$soln) {"\\begin{comment}"}`

inserts `\begin{comment}`

to comment out the solution (with matching code at the end to insert `\end{comment}`

). I've also indented everything with two tabs, so that the question numbers are formatted with a hanging-indent. (If you like this format, you don't have to type the double-tab for each new paragraph or chunk. If you do this for one line, then each subsequent time you press the `Enter`

key, the new line will automatically be formatted with the double-tab. Or, just type in all your text and code for a given question, then when you're done, highlight all of it and type `tab`

twice.)

```
---
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}"}`
```

Also, instead of knitting the file above interactively, you can render both versions by running the `render`

function in a separate R script. For example, assuming the file above is call `hw.Rmd`

, open a separate R script file and run the following:

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

Below is what `Solutions.doc`

looks like. `Homework.doc`

is similar, except everything from the bold word ** Solution:** onward is excluded: