【问题标题】:knitr: How to set a figure path in knit2html without using setwd()?knitr:如何在不使用 setwd() 的情况下在 knit2html 中设置图形路径?
【发布时间】:2014-03-02 04:30:58
【问题描述】:

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

report.Rmd 包含:

```{r }
plot(cars)
```

knit_reports.R 包含:

library(knitr)
knit2html("./docs/report.Rmd", "./docs/report.html")

如果我运行knit_reports.R,则会生成一个 html 页面,但页面上不会显示数字。

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

report.Rmd 中设置knitr 选项root.dir 或base.dir 并不能解决问题,我尝试了opts_knit$set(root.dir = "./docs")opts_knit$set(base.dir = "/project/docs")

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

setwd("./docs/")
knit2html("report.Rmd", "report.html")

创建了一个/project/docs/figure 文件夹,并且数字出现在 html 页面上。

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

【问题讨论】:

  • 澄清一下:setwd() 只有在计算开始后才坏。它本质上不是邪恶的。相反,setwd() 一切之前总是一个 的想法。之后,您假设所有内容都与当前工作目录相关,这将使您的生活更轻松。设置knit()knit2html()output 参数几乎总是一个坏主意。好吧,我承认这是我作为包作者的头痛。我鼓励你只用setwd("./docs/"); knit2html("report.Rmd"),你会得到report.html
  • 感谢亿辉的评论。我发现使用opts_knit$set(base.dir = 'docs') 可以解决我的问题。起初我尝试在 Rmd 文档的块选项中设置base.dir。这没有用。但是在 R 脚本 knit_reports.R 中设置 base.dir 选项确实有效并解决了我的问题:-)

标签: r knitr r-markdown


【解决方案1】:

看看这个page on chunk options。特别是,您有两种选择

  1. 使用fig.path 设置相对于您的工作目录的绘图目录 (OR)
  2. 使用base.dir 设置保存绘图的绝对目录。

我认为 (2) 在您的情况下可能是更好的解决方案。不要在 knitr 文档中使用 setwd(),因为这不是保持文档可重复性的好习惯。

【讨论】:

  • 感谢您的回答,我尝试了这些选项,但它们不适用于我的情况。我在上面给出了一个最小的可重现示例。
【解决方案2】:

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")

【讨论】:

  • 我认为在 Rmd 文档中移动 opts_knit$set(...) 并将其放在第一个代码块中也应该可以。无论如何,@yihui 的评论在与 Rmd 文件相同的目录下运行knitr 是非常有用的。
  • 在 Rmd 文档中的第一个代码块中设置 opts_knit$set(...) 对我不起作用。告诉我,如果您设法在系统上尝试使用上述 2 个文件会发生什么。
  • 由于某种原因,当我生成文件时,.tex 文档没有使用正确的目录。他们都只是figure/image_filename,而不是base.dir/figure/image_filename
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2016-01-29
    • 2011-05-14
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    相关资源
    最近更新 更多