tutorial sheet reports language examples ecuaciones cheat r markdown code-snippets rstudio

sheet - Cómo ocultar código en RMarkdown, con opción de verlo



r reports (2)

Esto se ha hecho mucho más fácil con el paquete rmarkdown , que no existía hace tres años. Básicamente, solo activa el "plegado de código": http://rmarkdown.rstudio.com/html_document_format.html#code_folding . Ya no tienes que escribir ningún JavaScript.

P.ej

--- title: "Habits" output: html_document: code_folding: hide ---

Estoy escribiendo un document RMarkdown en el que me gustaría volver a ejecutar algunos fragmentos (5 a 9). No hay necesidad de mostrar estos trozos de nuevo, así que consideré usar

```{r echo=FALSE}

para volver invisibles los fragmentos, como se describe en otra pregunta de stackoverflow . Esto está bien y genera los resultados deseados (ajuste mejorado de la segunda iteración; vea esta solución implementada here ).

Sin embargo, en un mundo ideal, el código sería expandible para que el usuario pueda ver exactamente lo que está pasando si lo desea con fines educativos y de claridad (por ejemplo, consulte el enlace a la solución de Greasemonkey here ) en lugar de ocultarlo como en mi segundo ejemplo de rpubs. La solución puede parecer algo como esto, pero con una caja circundante más corta para evitar distracciones:

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])

Estoy feliz con la solución echo=F , pero estaría aún más feliz con un fragmento de código expandible.

Edición: todos los ejemplos de RPubs, excepto el primero, ahora se han eliminado, para evitar obstruir su excelente sistema de publicación con esencialmente el mismo documento.


Si agrega una etiqueta html antes de su código, puede usar los selectores de CSS para hacer cosas inteligentes en los bits de la salida. Markdown pasa fácilmente el código HTML a través de:

<style> div.hidecode + pre {display: none} </style> <div class="hidecode"></div> ```{r} summary(cars) ```

Aquí mi regla de estilo CSS coincide con la primera etiqueta <pre> después de un <div class=hidecode> y la establece como invisible. Markdown escribe el fragmento R con dos etiquetas <pre> : una para la R y otra para la salida, y esta CSS captura la primera.

Ahora que sabe cómo hacer coincidir el código y los bloques de salida en CSS, puede hacer todo tipo de cosas inteligentes con ellos en Javascript. Podría poner algo en la <div class=hidecode> y agregar un evento de clic que alterne la visibilidad:

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

El siguiente paso en la complejidad es hacer que la acción cambie, pero entonces también puedes usar jQuery y obtener un verdadero funky. O utilice este método simple. Hagámoslo con un botón, pero también necesitas un div para obtener tus ganchos en el comando PRE del bloque R, y el recorrido se complica un poco:

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

(Nota: pensé que podrías envolver los trozos R en etiquetas <div> :

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

pero eso falla, ¿alguien sabe por qué?)