在包中设置一个.Rmd,将文件写入当前项目工作目录

Set an .Rmd in a package to write files to the current project working directory

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

形式的文件路径执行此操作

做个例子

  1. 打开 rstudio
  2. 转到 rhs 'project' 菜单,select 并创建一个新的 随心所欲地投射
  3. 转到 lhs 'new script' 下拉菜单并 select 'new .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 对象输出检索到环境或工作目录中, 在调用报告时,不必为每个不同的项目修改报告?此外,为什么这种方法特别糟糕?

为了关闭它:

我选择保留包中包含的 .Rmd。 .Rmd 需要移动并与包一起进行版本控制,因为它包含它们用于 运行.

的功能

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

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

测试了@CL 的答案后,这也 运行s 并且不依赖于 Rstudio 作为 IDE,但是我知道这些文档将

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