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

Setting work directory in knitr using opts_chunk$set(root.dir = …) doesn't work

我的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/vignettes,而knitr::chunk_opts$get("root_dir")返回/Users/Me/Docs/Proj

这是Rmd文件的最小示例:

1
2
3
4
5
6
```{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版本。 这是我的会议信息:

1
2
3
4
5
6
7
8
9
10
11
12
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

任何帮助,感激不尽。 如果您需要更多信息,请对该问题发表评论。 提前致谢!


它是knitr::opts_knit而不是knitr::opts_chunk


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

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

1
2
3
4
5
```{r setup}

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

```

setup块中。

另请参阅在R Studio和https://support.rstudio.com/hc/zh-CN/community/posts/220826588-Working-directory-in-R-Notebooks中自动查找当前R项目的路径。


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


有关通过root.dir =设置工作目录的实现的一些详细信息。
尽管Yihui和Tommy已经有一些很棒的答案。我仍然被困在设置工作目录中。所以我想在这里做一个完整的答案。

  • 从knitr文档中:
  • Knitr’s settings must be set in a chunk before any chunks which rely on those settings to be active. It is recommended to create a knit configuration chunk as the first chunk in a script with cache = FALSE and include = FALSE options set. This chunk must not contain any commands which expect the settings in the configuration chunk to be in effect at the time of execution.

  • 我的代码示例:
  • 就我而言,.Rproj.Rmd文件位于同一文件夹中。

    1
    2
    3
    4
    5
    ```{r setup, include=FALSE, cache = FALSE}
    require("knitr")
    ## setting working directory
    opts_knit$set(root.dir ="~/Documents/R/Example")
    ```

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

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

    因此,

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ```{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:/...')

    ```