我是一位指导老师,希望通过更改我创建的称为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用户,在数学命令中的所有内容都需要双斜杠也很烦人。)

还有另一种方法吗?

最佳答案

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

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

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

另外,您可以通过在单独的R脚本中运行render函数来呈现两个版本,而不是交互式地编织上述文件。例如,假设上面的文件名为hw.Rmd,请打开一个单独的R脚本文件并运行以下命令:
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相似,除了从粗体字 Solution: 开始的所有内容除外:

r - 有没有办法在Rmarkdown中执行条件性Markdown块?-LMLPHP

关于r - 有没有办法在Rmarkdown中执行条件性Markdown块?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39550732/

10-11 17:48