【问题标题】:Set an .Rmd in a package to write files to the current project working directory在包中设置一个 .Rmd 以将文件写入当前项目工作目录
【发布时间】:2025-12-22 03:25:12
【问题描述】:

我有一个.Rmd,我用它来报告许多不同 r 项目中的数据质量。然后,它将拆分数据以删除具有缺失数据的子集,并在适当的地方插入缺失的结果。它会通过 write.csv 命令以“./Cleansed_data/”的形式写入文件路径

举个例子

  1. 打开rstudio
  2. 进入 rhs 的“项目”菜单,选择并新建一个 随心所欲地进行项目
  3. 转到 lhs 的“新脚本”下拉菜单并 选择“新的 .Rmd”
  4. 将输出更改为 .pdf 并点击确定
  5. 在最后 r 块包括write.csv(mtcars, file = "mtcars.csv")
  6. 打'针织 pdf' 按钮,将报告另存为"writeFile.Rmd" 到您的项目工作目录,然后 让它运行。

以前我将这个 .Rmd 从一个地方移动到另一个地方,但是现在我想将它构建到一个内部包中。我已将它(如文档所示)包含在包目录中的 inst/rmd 中。

  1. 为了执行此构建或打开您有权访问的任何包
  2. 将文件添加到inst/rmd(如果不存在则创建)
  3. 重建包

然后我重建包并打开一个新项目。我加载我的新包并尝试通过render 命令运行文档,使用system.file 命令来定位.rmd,就像这样

rmarkdown::render(input = system.file("rmd/writeFile.Rmd", package="MyPackage"), 
              output_file = "writeFile.pdf", output_dir = "./Cars/)

这会将来自包构建的报告呈现到来自output_dir 的文件夹中,但是,这里有许多陷阱。首先,如果我省略output_dir 参数,报告将呈现到包库中,通常位于安装在c 盘中的库r 中。不过这是可以修复的。

我无法解决的是,当.Rmd 命中write.csv() 时(我相信)当时正在在包环境中呈现 .Rmd,其工作目录是包库文件夹,而不是当前项目目录。

问题

  1. 如何告知包中的模板 rstudio 项目的当前工作目录是什么?我隐约知道可能有一个 rstudio api 包?我几乎不知道它是什么,或者这是否会提供解决方案。
  2. 如果这完全不可能,或者可能只是一个非常糟糕的主意,我该如何修改工作流以成功地将多个 r 对象输出检索到环境或工作目录中,调用报告,而不必为每个不同的项目修改报告?此外,为什么这种方法特别糟糕?

【问题讨论】:

  • 所以我有一个实用的解决方案。在.rmdwrite.csv(mtcars, file = paste0(rstudioapi::getActiveProject(), "mtcars.csv"))。我会把这个问题留一段时间,以便收集更多的方法/警告。
  • 不确定我是否了解了所有详细信息,因此这是评论而不是答案:您可以在致电 render 之前保存工作目录 wd<-getwd()wd 将在 RMD 文件中可用。在那里,您可以使用knitr::opts_knit$set(root.dir = wd) 更改所有块的工作目录。你的包可以包含一个render 的包装器,负责将工作目录保存到wd
  • 谢谢@CL。不需要 rstudioapi 或 R Studio 环境的不错的替代方案。
  • 我不认为有什么对错,但这只是我的选择:我选择 Rmd 文件(或任何 knitr 源文件)作为“宇宙中心”,意思是任何路径都相对于 Rmd 的路径。有些人可能会争辩说当前 R 会话的工作目录是“宇宙中心”。我明白这一点,但我个人的选择是当我在 Rmd 文档中时,我所有关于路径的推理都将从那里开始。这确实是一个很难做出的选择。两种选择各有利弊。然后我还是提供了opts_knit$set(root.dir),希望用户不会真的需要它。
  • 感谢@Yihui 的分享。另外,感谢knitr。这是我每天都在使用的出色作品。

标签: r packages knitr environment


【解决方案1】:

为了关闭这个:

我已选择将 .Rmd 包含在包中。 .Rmd 需要移动并使用包进行版本控制,因为它包含它们用于运行的功能。

为了满足我的要求,我通过表单中的 rstudio api 设置文档样式以获取工作目录。

write.csv(mtcars, file = paste0(rstudioapi::getActiveProject(), "mtcars.csv"))

已经测试了@CL 的答案,它也可以运行并且不依赖于 Rstudio 作为 IDE,但是我知道这些文档会

  1. 始终通过 rstudio IDE 访问
  2. 始终从特定项目中访问
  3. 我担心(尽管尚未测试)将文件的工作目录设置为人工引导到不同的 WD 可能会产生其他影响。这可能是我以后可能想要包含的子文档之类的东西,或者可能需要与包安装的文件路径相关的其他代码,而不是项目。这样,我认为(如果我正确地解释了 Yuhui)r doc 仍然是它自己宇宙的中心。它只是将它的数据写入另一个 :)

【讨论】: