[R] Paths in knitr

Duncan Murdoch murdoch.duncan at gmail.com
Thu Jun 8 17:03:39 CEST 2017

On 08/06/2017 7:15 AM, G.Maubach at weinwolf.de wrote:
> Hi All,
> I have to compile a report for the management and decided to use RMarkdown
> and knitr. I compiled all needed plots (using separate R scripts) before
> compiling the report, thus all plots reside in my graphics directory. The
> RMarkdown report needs to access these files. I have defined
> ```{r setup, include = FALSE}
> knitr::opts_knit$set(
>   echo = FALSE,
>   xtable.type = "html",
>   base.dir = "H:/2017/Analysen/Kundenzufriedenheit/Auswertung",
>   root_dir = "H:/2017/Analysen/Kundenzufriedenheit/Auswertung",
>   fig.path = "results/graphics")  # relative path required, see
> http://yihui.name/knitr/options
> ```
> and then referenced my plot using
> <img src = "email_distribution_pie.png"></img>
> because I want to be able to customize the plotting attributes.
> But that fails with the message "pandoc.exe: Could not fetch
> email_distribution_pie.png".
> If I give it the absolute path
> "H:/2017/Analysen/Kundenzufriedenheit/Auswertung/results/graphics/email_distribution_pie.png"
> it works fine as well if I copy the plot into the directory where the
> report.RMD file resides.
> How can I tell knitr to fetch the ready-made plots from the graphics
> directory?

Put the path in a variable, and use that in the img tag, e.g.

gdir <- file.path(knitr::opts_knit$get("base.dir"), "graphics")

<img src = `r file.path(gdir, "email_distribution_pie.png")`></img>

If you think that is still too much typing, you could make a little 
function to turn a string like "email_distribution_pie" into the fully 
specified path.

HOWEVER:  Your workflow may not be ideal.  It is almost always better to 
produce the graphs in code that's in the document, rather than in 
separate R scripts.   This makes it *much* easier to modify the plots 
and be sure that the latest version makes it into the report.

If the plots require lots of code and you think it would be distracting 
in the source of your document, then it's time to make a private 
package, and put the code in there.  In the document, just include calls 
to functions from that package.

Duncan Murdoch

More information about the R-help mailing list