【发布时间】:2025-12-22 03:25:12
【问题描述】:
我有一个.Rmd,我用它来报告许多不同 r 项目中的数据质量。然后,它将拆分数据以删除具有缺失数据的子集,并在适当的地方插入缺失的结果。它会通过 write.csv 命令以“./Cleansed_data/”的形式写入文件路径
举个例子
- 打开rstudio
- 进入 rhs 的“项目”菜单,选择并新建一个 随心所欲地进行项目
- 转到 lhs 的“新脚本”下拉菜单并 选择“新的 .Rmd”
- 将输出更改为 .pdf 并点击确定
- 在最后 r
块包括
write.csv(mtcars, file = "mtcars.csv") - 打'针织
pdf' 按钮,将报告另存为
"writeFile.Rmd"到您的项目工作目录,然后 让它运行。
以前我将这个 .Rmd 从一个地方移动到另一个地方,但是现在我想将它构建到一个内部包中。我已将它(如文档所示)包含在包目录中的 inst/rmd 中。
- 为了执行此构建或打开您有权访问的任何包
- 将文件添加到
inst/rmd(如果不存在则创建) - 重建包
然后我重建包并打开一个新项目。我加载我的新包并尝试通过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,其工作目录是包库文件夹,而不是当前项目目录。
问题
- 如何告知包中的模板 rstudio 项目的当前工作目录是什么?我隐约知道可能有一个 rstudio api 包?我几乎不知道它是什么,或者这是否会提供解决方案。
- 如果这完全不可能,或者可能只是一个非常糟糕的主意,我该如何修改工作流以成功地将多个 r 对象输出检索到环境或工作目录中,调用报告,而不必为每个不同的项目修改报告?此外,为什么这种方法特别糟糕?
【问题讨论】:
-
所以我有一个实用的解决方案。在
.rmd:write.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