knitr:如何在不使用setwd()的情况下在knit2html中设置地物路径?

knitr:如何在不使用setwd()的情况下在knit2html中设置地物路径?,r,knitr,r-markdown,R,Knitr,R Markdown,我在一个项目文件夹中工作,假设它的绝对路径是:/projectgetwd()告诉我我在这个项目文件夹中。我的所有文件读取和写入都与此项目根相关/project有一个子文件夹/project/docs/,其中有一个R Mardown文件和一个R脚本: 报告。Rmd包含: ```{r } plot(cars) ``` library(knitr) knit2html("./docs/report.Rmd", "./docs/report.html") 和knit\u报告。R包含: ```{r }

我在一个项目文件夹中工作,假设它的绝对路径是:
/project
getwd()
告诉我我在这个项目文件夹中。我的所有文件读取和写入都与此项目根相关
/project
有一个子文件夹
/project/docs/
,其中有一个R Mardown文件和一个R脚本:

报告。Rmd
包含:

```{r }
plot(cars)
```
library(knitr)
knit2html("./docs/report.Rmd", "./docs/report.html")
knit\u报告。R
包含:

```{r }
plot(cars)
```
library(knitr)
knit2html("./docs/report.Rmd", "./docs/report.html")

如果运行
knit_reports.R
,将生成一个html页面,但页面上不会显示图形

问题是图形存储在
/project/figures
下。它们在生成html文档时不可见。我正在寻找一种方法,告诉knitr将图片存储在
/project/docs/figures

report.Rmd中设置knitr options root.dir或base.dir无法解决问题,我尝试了
选择knit$set(root.dir=“./docs”)
选择knit$set(base.dir=“/project/docs”)

但是,如果我将工作目录更改为
/project/docs

setwd("./docs/")
knit2html("report.Rmd", "report.html")
将创建一个
/project/docs/figure
文件夹,图形将显示在html页面上

许多人说在脚本中使用setwd()是不好的,因为它会破坏再现性。我如何告诉knitr在不使用setwd()的情况下将图形放置在我的项目子文件夹中?

看看这个。特别是,您有两个选择

  • 使用
    fig.path
    设置相对于工作目录的绘图目录(或)
  • 使用
    base.dir
    设置保存绘图的绝对目录

  • 我认为(2)在您的环境中可能是更好的解决方案。不要在
    knitr
    文档中使用
    setwd()
    ,因为这不是保持文档可复制性的好做法。

    Ramnath对set base.dir的回答是好答案。但一开始我认为应该在Rmd块中设置选项,但这不起作用。该选项应在R脚本中设置。我想这是一个范围问题

    因此,在我上面的示例中,knit_reports.R应该包含:

    library(knitr)
    opts_knit$set(base.dir = 'docs') # Change the base dir where to save figures
    knit2html("./docs/report.Rmd", "./docs/report.html")
    

    我想补充一点,如果在knit2html中指定不同的输出目录,您可能会遇到问题,因为figure文件夹保存到原始目录中。那么,至少根据我的经验,html文件将不包含您的绘图。所以:正如其他地方提到的。尽量不要更改输出目录

    谢谢您的回答,我尝试了这些选项,但它们在我的情况下不起作用。我在上面给出了一个最小的可重复的例子。只是为了澄清:
    setwd()
    只有在计算开始后才是坏的。它并非天生邪恶。相反,最好先
    setwd()
    。之后,您假设所有内容都与当前工作目录相关,这将使您的生活更加轻松。设置
    knit()
    knit2html()
    output
    参数几乎总是一个坏主意。嗯,我承认这是我作为软件包作者的头痛。我鼓励您只需
    setwd(“./docs/”);knit2html(“report.Rmd”)
    ,您将获得
    report.html
    。感谢易慧的评论。我发现使用
    opts\u knit$set(base.dir='docs')
    可以解决我的问题。起初,我尝试在Rmd文档的块选项中设置
    base.dir
    。这不管用。但是在R脚本
    knit_reports.R
    中设置
    base.dir
    选项确实有效,并解决了我的问题:-)我认为在Rmd文档中移动
    opts_knit$set(…)
    并将其放置在第一个代码块中也应该有效。在任何情况下,@yihui在Rmd文件所在的目录中运行
    knitr
    的注释都是非常有用的。在Rmd文档的第一个代码块中设置opts_knit$set(…)对我来说不起作用。请告诉我,如果您尝试在系统上使用上述2个文件,会发生什么情况。由于某些原因,.tex文档在生成文件时没有使用正确的目录。它们都只是
    figure/image\u文件名
    ,而不是
    base.dir/figure/image\u文件名