有没有办法在Rmarkdown中执行条件降价块执行?

时间:2016-09-17 19:12:17

标签: r markdown knitr r-markdown pandoc

我是一名教师,希望通过更改我创建的名为soln的文档参数,从同一个Rmarkdown文件中完成家庭作业和家庭作业解决方案指南。生成soln=FALSE分配文档时,以及soln=TRUE生成家庭作业解决方案指南时。我可以使用document参数控制R代码块执行,但我还希望有条件地包含markdown文本。

我目前的解决方法很难看:

---
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.
")
```

我想要做的是将包含cat函数的块替换为编写解决方案指南的人更优雅和可读的内容。我目前的方法对我来说已经足够了,但我不能让我的合作教师使用它,因为在cat函数中编写解决方案是如此不愉快。 (作为一名LaTeX用户,在数学命令中需要双斜线也很烦人。)

还有其他办法吗?

2 个答案:

答案 0 :(得分:21)

您可以像在cat中一样编写解决方案,而不是使用rmarkdown从R代码块中打印解决方案(即,使用通常的文本组合{{1当你不想在最终文档中包含解决方案时,使用参数latex注释掉该部分。}}和R代码块。

在下面的示例soln文档中,如果参数rmarkdownsoln,则行FALSE会插入r if(!params$soln) {"\\begin{comment}"}以注释掉解决方案(在末尾匹配代码以插入\begin{comment})。我还使用两个选项卡缩进所有内容,以便使用悬挂缩进格式化问题编号。 (如果您喜欢这种格式,则不必为每个新的段落或块键入双标签。如果您对一行执行此操作,则每次按下\end{comment}键时,新行将自动使用双标签进行格式化。或者,只需键入所有文本和代码,然后在完成后,突出显示所有内容并键入Enter两次。)

tab

此外,您可以通过在单独的R脚本中运行--- 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}"}` 函数来渲染这两个版本,而不是以交互方式编写上述文件。例如,假设上面的文件名为render,请打开一个单独的R脚本文件并运行以下命令:

hw.Rmd

以下是for (i in c(TRUE, FALSE)) { rmarkdown::render("hw.Rmd", params = list(soln = i), output_file=ifelse(i, "Solutions.doc", "Homework.doc")) } 的样子。 Solutions.doc类似,但不包括粗体字 Homework.doc 以后的所有内容:

enter image description here

答案 1 :(得分:1)

我能够构建this answer以制作不使用乳胶包的东西(虽然我正在生成HTML幻灯片,所以这可能就是为什么这样做了。)

您希望评论开始的地方,只需添加: `r if(params$soln) {"<!--"}`

然后添加此内容以结束评论: `r if(params$soln) {"-->"}`

这不需要我编辑任何这样包含的条件执行代码块或其他任何类似的代码块。希望这有助于某人!