web-dev-qa-db-ja.com

RMarkdownでコードを非表示にする方法と、それを表示するオプション

私はRMarkdown document を書いていて、その中でいくつかのチャンク(5から9)を再実行したいと思います。これらのチャンクを再度表示する必要がないため、使用を検討しました

```{r echo=FALSE}

別の stackoverflow質問 で説明されているように、再実行されたチャンクを非表示にします。これは問題なく、望ましい結果を出力します(2回目の反復の適合の改善-このソリューションの実装を参照 here )。

ただし、理想的な世界では、コードは拡張可能であるため、ユーザーは、教育目的および明確化のために必要な場合に何が行われているのかを正確に確認できます(たとえば、Greasemonkeyソリューションへのリンク here )として非表示にするのではなく2番目のrpubsの例では。解決策は次のようになりますが、注意散漫を避けるために周囲のボックスを短くします。

for (i in 1:nrow(all.msim)){ # Loop creating aggregate values (to be repeated later)
  USd.agg[i,]   <- colSums(USd.cat * weights0[,i])
}

for (j in 1:nrow(all.msim)){
weights1[which(USd$age <= 30),j] <- all.msim[j,1] /USd.agg[j,1] 
weights1[which(USd$age >= 31 & USd$age <= 50),j] <- all.msim[j,2] /USd.agg[j,2] 
weights1[which(USd$age >= 51),j] <- all.msim[j,3] /USd.agg[j,3] ## 
}
# Aggregate the results for each zone
for (i in 1:nrow(all.msim)){
  USd.agg1[i,]   <- colSums(USd.cat * weights0[,i] * weights1[,i])
}
# Test results 
for (j in 1:nrow(all.msim)){
weights2[which(USd$sex == "m"),j] <- all.msim[j,4] /USd.agg1[j,4]  
weights2[which(USd$sex == "f"),j] <- all.msim[j,5] /USd.agg1[j,5] 
}

for (i in 1:nrow(all.msim)){
USd.agg2[i,]   <- colSums(USd.cat * weights0[,i] * weights1[,i] * weights2[,i])
}

for (j in 1:nrow(all.msim)){
weights3[which(USd$mode == "bicycle"),j] <- all.msim[j,6] /USd.agg2[j,6]  
weights3[which(USd$mode == "bus"),j] <- all.msim[j,7] /USd.agg2[j,7] 
weights3[which(USd$mode == "car.d"),j] <- all.msim[j,8] /USd.agg2[j,8]  
weights3[which(USd$mode == "car.p"),j] <- all.msim[j,9] /USd.agg2[j,9]
weights3[which(USd$mode == "walk"),j] <- all.msim[j,10] /USd.agg2[j,10]
}
weights4 <- weights0 * weights1 * weights2 * weights3
for (i in 1:nrow(all.msim)){
USd.agg3[i,]   <- colSums(USd.cat * weights4[,i])
}
# Test results 
plot(as.vector(as.matrix(all.msim)), as.vector(as.matrix(USd.agg3)),
     xlab = "Constraints", ylab = "Model output")
abline(a=0, b=1)
cor(as.vector(as.matrix(all.msim)), as.vector(as.matrix(USd.agg3)))
#rowSums(USd.agg3[,1:3]) # The total population modelled for each zone, constraint 1
#rowSums(USd.agg3[,4:5])
#rowSums(USd.agg3[,6:10])

私はecho=Fソリューションに満足していますが、拡張可能なコードスニペットを使用すればさらに幸せになります。

編集:最初のものを除くすべてのRPubsの例は削除され、優れたパブリケーションシステムが本質的に同じドキュメントで詰まるのを回避しています。

30
RobinLovelace

これは、3年前には存在しなかった rmarkdown パッケージではるかに簡単になりました。基本的には、「コードの折りたたみ」をオンにするだけです: http://rmarkdown.rstudio.com/html_document_format.html#code_folding 。 JavaScriptを記述する必要はもうありません。

例えば。

---
title: "Habits"
output:
  html_document:
    code_folding: hide
---
43
Yihui Xie

コードの前にhtmlタグを追加すると、CSSセレクターを使用して出力のビットに巧妙な処理を行うことができます-markdownはHTMLを手軽に渡します。

<style>
div.hidecode + pre {display: none}
</style>

<div class="hidecode"></div>
```{r}
summary(cars)
```

ここで、CSSスタイルルールは<pre>の後の最初の<div class=hidecode>タグに一致し、非表示に設定します。 Markdownは、2つの<pre>タグを使用してRチャンクを書き込みます。1つはR用、もう1つは出力用で、このCSSは最初のものをキャッチします。

CSSのコードと出力ブロックを一致させる方法がわかったので、JavaScriptであらゆる種類の賢いことを行うことができます。 <div class=hidecode>タグに何かを配置し、表示を切り替えるクリックイベントを追加できます。

<style>
div.hidecode + pre {display: none}
</style>
<script>
doclick=function(e){
e.nextSibling.nextSibling.style.display="block";
}
</script>

<div class="hidecode" onclick="doclick(this);">[Show Code]</div>
```{r}
summary(cars)
```

複雑さの次のステップは、アクションを切り替えることですが、jQueryを使用して本当のファンキーを手に入れることもできます。または、この簡単な方法を使用します。ボタンでそれをやってみましょうが、フックをRコマンドのPREブロックに入れるためにdivも必要で、トラバーサルは少し複雑になります。

<style>
div.hideme + pre {display: none}
</style>
<script>
doclick=function(e){
code = e.parentNode.nextSibling.nextSibling.nextSibling.nextSibling
if(code.style.display=="block"){
 code.style.display='none';
 e.textContent="Show Code"
}else{
 code.style.display="block";
 e.textContent="Hide Code"
}
}
</script>

<button class="hidecode" onclick="doclick(this);">Show Code</button>
<div class="hideme"></div>
```{r}
summary(cars)
```

(注:Rチャンクを<div>タグでラップできると思いました:

<div class="dosomething">
```{r}
summary(cars) 
``` 
</div>

しかし、それは失敗します-誰かが理由を知っていますか?)

9
Spacedman