4 votes

Document RMarkdown - Comment retarder l'évaluation par knitr d'un morceau de code en ligne jusqu'à ce que des morceaux ultérieurs aient été traités ?

J'ai créé un rapport rmarkdown, avec un certain nombre de morceaux de code. Je suis maintenant en train de créer un résumé de la page d'accueil pour ce rapport, et je voudrais inclure un calcul en ligne du genre

Blah blah blah summary stuff.... We found the mean to be `r mean(some_object_from_the_report)`. Blah blah blah more summary stuff.

Étant au début du fichier RMD, some_object_from_the_report n'existe pas encore. Existe-t-il un moyen de dire à knitr de ne pas évaluer ce bout de code avant que les éléments suivants aient tous été calculés ?

Merci pour tous les conseils !

EDIT :

La suggestion comme commentaire est de mettre echo=false dans les options de knitr. Soit je m'y prends mal, soit cela n'aide pas ma situation. Le court exemple suivant illustre cela.

---
title: "Minimal test of delayed evaluation"
author: "sff"
date: "December 13, 2017"
output: html_document
---

```{r setup, include=TRUE}
knitr::opts_chunk$set(echo = FALSE)
```

## Summary

Summary of blahblahblah. Also here's a mean from the report: `r mean(testobj)`.

## Report

```{r report_stuff}
testobj <- c(1, 2, 3)
```

Knitr lance une erreur d'objet non trouvé. Est-ce que j'implémente mal la suggestion, ou est-ce que la suggestion n'atteint pas ce que je cherche ?

1voto

Cedric Points 1522

Voici un exemple simple de travail, vous définissez un premier morceau avant le résumé, il peut être défini au tout début du document si vous avez besoin d'ajuster d'autres choses comme \graphicspath{} .

Dans ce chunk, vous créez une liste si le fichier Rdata contenant la liste n'existe pas. Vous devez la remplir avec les valeurs appelées dans le texte.

Lors de la première exécution de l'exemple, vous obtenez first run

Au deuxième passage, vous obtenez

second run

Notez que de cette façon, vous pouvez éviter d'exécuter de longs calculs et simplement enregistrer leurs résultats.

\documentclass{article}    
\title{Testing how to save results for the abstract}
\author{}
\begin{document}
% this chunk comes just after begin{document}
<< init, echo=FALSE, eval=TRUE,results="hide" >>=
require(knitr)
summary_list_path <-paste0(getwd(),"/data/summary_list.Rdata")
if (!file.exists(summary_list_path)){
  summary_list<-list()
  summary_list[["A"]]<-list()
  summary_list[["B"]]<-list()
  summary_list[["A"]][["N"]]<-NA
  summary_list[["A"]][["p"]]<-NA
  summary_list[["B"]][["text"]]<-"extremely sad"
} else {
  load(summary_list_path)
}
@
\maketitle
\begin{abstract}
My population is \Sexpr{summary_list[["A"]][["N"]]} and the p value was \Sexpr{summary_list[["A"]][["p"]]} as a result I am \Sexpr{summary_list[["B"]][["text"]]}
\end{abstract}

<<chunk_1, echo=FALSE, eval=TRUE,results="hide" >>=
summary_list[["A"]][["N"]]<-20
summary_list[["A"]][["p"]]<-0.05
# save your list at the end of each chunk, that was you can also avoid 
# processing everyting.
save(summary_list,file=summary_list_path)
@

<<chunk_2, echo=FALSE, eval=TRUE,results="hide" >>=
summary_list[["B"]][["text"]]<-"happy"
save(summary_list,file=summary_list_path)
@

\end{document}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X