web-dev-qa-db-ja.com

Rmarkdownで条件付きマークダウンチャンクを実行する方法はありますか?

私は、作成したドキュメントパラメータsolnを変更して、同じRmarkdownファイルから宿題と宿題ソリューションガイドを作成しようとしているインストラクターです。いつ soln=FALSE割り当てドキュメントが生成され、いつsoln=TRUE宿題ソリューションガイドが生成されます。 documentパラメーターを使用してRコードチャンクの実行を制御できますが、マークダウンテキストを条件付きで含めたいです。

私の現在の回避策は醜いです:

---
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ユーザーとして、mathコマンド内のすべてにダブルスラッシュが必要なのも面倒です。)

これを行う別の方法はありますか?

20
thatssobayesic

catを使用してRコードチャンク内からソリューションを出力する代わりに、rmarkdownで通常行うようにソリューションを記述できます(つまり、テキストの通常の組み合わせでlatex、およびRコードチャンク)、最終的なドキュメントにソリューションを含めない場合は、パラメーターsolnを使用してそのセクションをコメント化します。

以下のサンプルrmarkdownドキュメントで、パラメータsolnFALSEの場合、r if(!params$soln) {"\\begin{comment}"}行は\begin{comment}を挿入してソリューションをコメント化します(末尾に\end{comment}を挿入するための一致するコード)。また、2つのタブですべてをインデントしているので、質問番号はぶら下げインデントでフォーマットされています。 (この形式が気に入った場合は、新しい段落またはチャンクごとにダブルタブを入力する必要はありません。これを1行に入力すると、Enterキーを押すたびに、新しい行は自動的にダブルタブでフォーマットされます。または、特定の質問のすべてのテキストとコードを入力し、完了したら、すべてを強調表示してtabを2回入力します。)

---
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であると想定して、別の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も同様ですが、太字のWordSolution:以降はすべて除外されます。

enter image description here

22
eipi10

私はビルドアップできました この答え ラテックスパッケージを使用しないものを作成することができました(ただし、HTMLスライドを生成しているため、これが機能する理由かもしれません)。

コメントアウトを開始する場所に、以下を追加するだけです:`r if(params$soln) {"<!--"}`

そして、これを追加してコメントを終了します:`r if(params$soln) {"-->"}`

これにより、このように含まれているコードブロックを編集して条件付き実行などを行う必要がなくなりました。これが誰かを助けることを願っています!

1
xitrium