Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 881
Martin Studer Avatar asked Oct 21 '22 14:10

Martin Studer


1 Answers

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.

like image 64
Thell Avatar answered Nov 02 '22 09:11

Thell