使用opts_chunk $ set(root.dir = ...)在knitr中设置工作目录不起作用

时间:2015-05-14 12:23:34

标签: r rstudio knitr

My R项目的结构类似于包含目录/R/vignettes/data等的包。在/vignettes中的一个Rmd文档中,我提供了一个脚本,位于/R。在此脚本中,我使用read.csv()加载位于inst/extdata/的文件 现在的问题是,默认情况下,Rmd文件中的工作目录是文件所在的目录。我们称之为/Users/Me/Docs/Proj/vignettes。但是,为了使R脚本运行工作目录,需要是项目的主目录(/Users/Me/Docs/Proj)。
我尝试使用knitr::opts_chunk$set(root.dir = normalizePath("..")更改Rmd文件中的工作目录。但是显然这个不会更改工作目录,因为如果我之后调用getwd(),则输出仍为/Users/Me/Docs/Proj/vignettesknitr::chunk_opts$get("root_dir")会返回/Users/Me/Docs/Proj

这是一个最小的示例Rmd文件:

```{r}
getwd()  # returns 'Users/Me/Docs/Proj/vignettes'
knitr::opts_chunk$set(root.dir = normalizePath(".."))  # should change the working directory to 'Users/Me/Docs/Proj'
getwd()  # again returns 'Users/Me/Docs/Proj/vignettes'
knitr::opts_chunk$get("root.dir")  # returns 'Users/Me/Docs/Proj'
```

我正在使用RStudio版本0.99.435。这是我的会议信息:

R version 3.2.0 (2015-04-16)  
Platform: x86_64-apple-darwin14.3.0 (64-bit)  
Running under: OS X 10.10.3 (Yosemite)  

locale:
[1] de_DE.UTF-8/de_DE.UTF-8/de_DE.UTF-8/C/de_DE.UTF-8/de_DE.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
[1] htmltools_0.2.6 tools_3.2.0     yaml_2.1.13     rmarkdown_0.6.1 digest_0.6.8   

非常感谢任何帮助。如果您需要更多信息,请发表评论。提前谢谢!

5 个答案:

答案 0 :(得分:25)

It is knitr::opts_knit代替knitr::opts_chunk

答案 1 :(得分:9)

正如Yihui在回答中指出的那样,错误只是因为我使用了opts_chunk$set()而不是opts_knit$set()。 但是,值得注意的是,工作目录的更改不会影响当前但仅影响下一个块。所以e。 G。如果要加载相对于新工作目录的数据,请执行以下块中的数据。

答案 2 :(得分:9)

如果您有一个带有嵌套子文件夹的R项目,因此.Rproj和.Rmd文件位于不同的文件夹中,则可以使用命令rprojroot::find_rstudio_root_file()查找工作目录并将其设置为该项目的主文件夹在编织过程中(而不是包含rMarkdown代码文件的文件夹)。

因此至少应使用以下内容:

```{r setup}

knitr::opts_knit$set(root.dir = rprojroot::find_rstudio_root_file())

```
setup块内

另请参见Automatically finding the path of current R project in R Studiohttps://support.rstudio.com/hc/en-us/community/posts/220826588-Working-directory-in-R-Notebooks

答案 3 :(得分:2)

有关ave(!x, cumsum(x), FUN = cumsum) #[1] 0 1 0 1 2 3 0 0 1 2 设置工作目录的实现的一些详细信息。
尽管YihuiTommy已经给出了一些很棒的答案。我仍然被困在设置工作目录中。所以我想在这里做一个完整的答案。

  1. 来自knitr documentation
  

编织器的设置必须在任何依赖这些设置处于活动状态的块之前进行大块设置。建议在设置了 cache = FALSE和include = FALSE 选项的脚本中,将编织配置块作为第一个块。该块不得包含任何命令,这些命令期望配置块中的设置在执行时生效。

  1. 我的代码示例:

就我而言,root.dir =.Rproj文件位于同一文件夹中。

.Rmd

答案 4 :(得分:2)

对我来说knitr::opts_knit$setroot.dir一起工作,但与echo = FALSE不一起工作

同时

knitr::opts_chunk$set不适用于root.dir,但适用于echo = FALSE

因此

我在设置块中同时使用了这两个选项:

```{r settings, include = FALSE}

knitr::opts_chunk$set(echo = FALSE
                      , comment = NA
                      , warning = FALSE
                      , error = FALSE
                      , message = FALSE
                      , tidy = TRUE)

knitr::opts_knit$set(root.dir = 'C:/...')

```