【问题标题】:R knitr in RStudio: cannot set option for root directory structureRStudio中的R knitr:无法设置根目录结构的选项
【发布时间】:2016-12-29 23:45:09
【问题描述】:

在处理简单文件时,使用 RStudio 中的 Knit 按钮非常适合我,自动生成 Rmd 文件,然后生成 PDF。现在我正在做一个更大的项目,我已经将目录拆分为

MainProjectDir/

MainProjectDir/代码/

MainProjectDir/DataRaw/

MainProjectDir/DataWork/

getwd() 给了我 MainProjectDir 路径。 Code 目录中的 .r 文件相互调用,并使用 MainProjectDir 路径中的相对路径从/向 Data 目录加载和保存数据。

现在,当对代码目录中的 .r 文件使用 Knit 按钮时,出现连接错误:

文件错误(文件名,“r”,编码=编码):无法打开连接

在这里阅读了一些回复并查看了 Yihui 的页面后,我尝试在 knitr 包中设置 root.dir 选项

knitr::opts_knit$set(root.dir="..")

在控制台中按下 RStudio 中的 Knit 按钮之前。我仍然得到同样的错误。还尝试了路径的绝对路径版本。我做错了什么?

【问题讨论】:

  • 你试过使用rmarkdown::render函数吗?
  • 我正在使用 File/Knit 菜单命令,让 RStudio 调用 pandoc/knitr。在简单的目录结构上效果很好,这就是为什么我试图找到一种正确描述相对路径的方法。您建议的流程是什么?
  • 您在另一个脚本中使用了函数 rmarkdown::render。它可以更好地控制您的环境。最好在之前用rm(list = ls()) 清理你的全球环境,很难。
  • 在我走上这条路之前,为什么 knitr::opts_knit$set(root.dir="..") 不起作用?
  • 你知道你可以在你的脚本中放入 print(getwd()) 来知道脚本在哪里执行?

标签: r


【解决方案1】:

在 github 讨论线程上找到了该问题的解决方法,添加到 R 代码中并有效:

if (basename(getwd())=="Code") setwd(normalizePath(".."))

为寻求快速解决方案的任何人发布此内容,但如果有人可以解释问题所在

knitr::opts_knit$set(root.dir="..")

以及如何解决它,请发布,我会接受他的回答。

【讨论】:

    【解决方案2】:

    不确定这是否能解决您的所有问题,但您看过 Dean Attali 的 ezknitr 软件包吗?它为您提供了更多使用目录的灵活性。

    【讨论】:

    • 现在看了一下,根据文档,这个包确实应该允许我使用的目录结构。不过,现在我想保持使用 RStudio 编织按钮和原始 R 文件而不是 Rmd 的便利性,以便找到丑陋的解决方法。请参阅我在上面对 Gregor 的建议所写的评论。如果我能删除 setwd()...
    【解决方案3】:

    在 R 项目中使用嵌套文件结构时,请务必注意以下事项(如上面的 cmets 中所述)

    • 在 RStudio 中打开项目时,默认工作目录设置为包含 .Rproj 文件的文件夹(即 MainProjectDir/)。
    • 在编织过程中,Rstudio 打开一个全新的 R 会话,默认工作目录设置为包含 .Rmd 文件的文件夹(即 MainProjectDir/Code/)。
    • 可以使用knitr::opts_knit$set(root.dir="..")更改默认工作目录,但更改直到以下代码块才生效。所以在下一个代码块之前不要加载数据。
    • 在编织过程中,您可以使用命令knitr::opts_knit$set(root.dir = rprojroot::find_rstudio_root_file()) 将工作目录设置回包含.Rproj 文件的文件夹。

    所以至少使用以下内容:

    ---
    title: "Title"
    author: 'Author'
    date: "`r Sys.Date()`"
    output: html_document
    ---
    
    First chunk
    
    ```{r setup, include=TRUE}
    
    print(getwd())
    knitr::opts_knit$set(root.dir = rprojroot::find_rstudio_root_file())
    print(getwd())
    
    ```
    
    Second chunk
    
    ```{r load data}
    
    print(getwd())
    
    read.csv(file = "DataRaw/exampledata.csv")
    
    ```
    

    另请参阅Setting work directory in knitr using opts_chunk$set(root.dir = ...) doesn't workAutomatically finding the path of current R project in R Studiohttps://support.rstudio.com/hc/en-us/community/posts/220826588-Working-directory-in-R-Notebooks

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-18
      • 1970-01-01
      • 2013-04-13
      • 1970-01-01
      • 2014-10-03
      • 2011-05-01
      • 2021-04-19
      相关资源
      最近更新 更多