2017-06-26 1 views
2

Je rencontre un problème avec l'appel d'un script .Rmd fils dans un bloc de code parent. Le bloc R dans le fichier de démarquage R parent boucle sur les variables et appelle un fichier de démarchage R enfant qui utilise des variables du parent.Morceaux de code R de Knitr et Parent-enfant: Le segment d'un enfant ne peut pas reconnaître les variables du parent dans la boucle

Problème: le fichier de démarquage de l'enfant parcourt uniquement les variables du parent en dehors de Les blocs de code R en tant que code latex dans la démarque. Tout ce qui se trouve à l'intérieur d'un bloc de code R dans le fichier de démarquage enfant n'utilise que la première variable dans la boucle. Qu'est-ce qui pourrait provoquer le bon fonctionnement du code latex de l'enfant dans le démarquage, mais les blocs R ne permettent pas de suivre les variables changeantes dans la boucle du parent?

Un exemple théorique du fichier parent:

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

x <- as.vector(list(1:10)) 
``` 
## Now for the R chunk with loop on the child 
```{r parent} 

xD <- NULL 
for (i in 1:length(x[[1]])){ 
    out = NULL #reset the output of the loop to null, so duplicates aren't printed 
    xD[i] <- as.numeric(x[[1]][i])*2 
    currentValue <- xD[i] 
    out <- c(out, knit_expand(file = "test_child.Rmd")) 
    cat(knit(text=unlist(paste(out, collapse = '\n')), quiet=TRUE)) 
} 

Un exemple théorique du fichier enfant test_child.Rmd:

The value outside a code chunk is `r currentValue` and 
always updates with the variable in the parent's loop. 
```{r childchunk} 
    print(paste0("But inside a code chunk, the value is", currentValue, "and 
    remains the same as the first value, regardless of the parent's loop 
    index.")) ``` 

Répondre

4

Le problème est en baisse à l'utilisation de cache = TRUE

Si la le bloc est mis en cache, le code n'est pas en cours d'exécution, donc la dernière valeur de currentValue est ignorée.

{r childchunk, cache = FALSE} 
    print(paste0("But inside a code chunk, the value is ", currentValue, " and 
    remains the same as the first value, regardless of the parent's loop 
    index. Unless you set cache = FALSE")) 

Faites également attention aux parents. Si vous le laissez en cache, il ne sera pas mis à jour lorsque vous apporterez des modifications uniquement à l'enfant. Je suggère d'utiliser

{r parent, cache = FALSE} 

Vous pouvez bien sûr il suffit d'utiliser

knitr::opts_chunk$set(cache=FALSE) 
+0

La question était en effet les paramètres du cache! – Guy