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

时间:2016-03-09 10:30:27

标签: r packages knitr environment

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

的形式执行此操作

举个例子

  1. open rstudio
  2. 转到rhs'项目'菜单,然后选择并创建一个新菜单 项目无论你想要什么
  3. 转到lhs的“新脚本”下拉菜单 选择'new .Rmd'
  4. 将输出更改为.pdf并点击确定
  5. 在最后一个r chunk包括write.csv(mtcars, file = "mtcars.csv")
  6. 点击'针织 pdf'按钮,将报告保存为"writeFile.Rmd"到您的项目工作目录,以及 让它运行。
  7. 以前我把这个.Rmd从一个地方移到另一个地方,但是现在我想把它建成一个内部包。我已将它(如文档所示)包含在包目录中的inst/rmd中。

    1. 为了执行此操作,请构建或打开您有权访问的任何包
    2. 将文件添加到inst/rmd(如果不存在则创建它)
    3. 重建包
    4. 然后我重建包并打开一个新项目。我加载新包并尝试使用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对象输出,报告,而不必修改每个不同项目的报告?此外,为什么这种方法特别糟糕?

1 个答案:

答案 0 :(得分: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仍然是它自己宇宙的中心。它只是把它的数据写入另一个:)