Search code examples
rknitrsweaver-markdown

knitr: Knitting separate Rnw documents within an Rmd document


I have a master R markdown document (Rmd) within which I would like to knit several separate Rnw documents (NO child documents) in one of the chunks. However, when I call knit on the Rnw document, the contained R code chunks do not seem to be processed, resulting in an error when trying to run texi2pdf on them.

Illustration of the situation:

Inside master.Rmd:

```{r my_chunk, echo=FALSE, message=FALSE, results='asis'}

... some code ...

knit("sub.**Rnw**", output = ..., quiet = TRUE)

tools::texi2pdf(tex_file)

... some code ...


```

Is there some additional configuration required to make this scenario work?


Solution

  • There are a few reasons you can't directly do what you are trying to do (calling knit from within a knit environment)...

    1. Knitr patterns are already set.
      [ In this case markdown patterns, so you'd need to set the patterns to 'rnw' patterns. ]
    2. Parsing the chunks (after setting the correct patterns) will add chunk labels to the existing concordance, so unless all chunks are unique you will get a duplicate chunk label error.
      [ This is why knit_child exists. ]
    3. The output target and other options are already set, so you either need a completely new knitr environment or to save, modify, restore all pertinent options.

    That being said, it seems like completely expected behavior.

    Something along the lines of

    library(knitr)
    
    files <- list.files( pattern = "*.Rnw", path = ".")
    files
    
    ## [1] "test_extB.Rnw" "test_ext.Rnw"
    
    for( f in files ) {
      system( paste0("R -e \"knitr::knit2pdf('", f, "')\"") )
    }
    
    list.files( pattern="*.pdf", path=".")
    
    ## [1] "test_extB.pdf" "test_ext.pdf"
    

    or calling Rscript in a loop should do the trick (based on the info provided), which is essentially what @kohske was expressing in the comments.