如何在R包的Vignettes文档中跨文档共享对象?
在多个Vignettes之间复用R对象的解决方案
你遇到的问题其实很常见——每个Vignette都是在独立的R会话中编译的,所以第一个文档(aa)里创建的myobject并不会自动出现在第二个文档(bb)的会话里,自然会报“对象找不到”的错误。下面给你几个实用的解决办法:
方法1:重复创建对象(搭配knitr缓存优化)
最简单的方式就是在bb文档里也运行创建myobject的代码:
# 在bb.Rmd的代码块中 myobject <- mypkg::myfct() verif <- myobject[myfilters,]
如果myfct()运行速度慢,可以给代码块加上cache=TRUE参数,让knitr缓存结果,后续编译就不会重复执行耗时的代码了:
```{r cache=TRUE} myobject <- mypkg::myfct()
## 方法2:保存对象到文件,再加载复用 在aa文档的末尾,把`myobject`保存到RData文件中: ```r # 在aa.Rmd的最后一个代码块 save(myobject, file = "../vignettes/myobject.RData")
然后在bb文档开头加载这个文件:
# 在bb.Rmd的开头代码块 load("../vignettes/myobject.RData") verif <- myobject[myfilters,]
⚠️ 注意:记得把myobject.RData添加到你的.gitignore文件里,避免把生成的中间文件提交到版本控制。
方法3:使用knitr子文档统一管理共享代码
把创建myobject的代码单独放在一个子文档里(比如vignettes/common_code.Rmd),内容就是:
myobject <- mypkg::myfct()
然后在aa和bb文档里都通过knitr::child()引入这个子文档:
```{r child="common_code.Rmd"}
这种方式最利于维护——以后如果要修改创建`myobject`的逻辑,只需要改子文档就行,不用在两个vignette里重复修改。 内容的提问来源于stack exchange,提问作者Damien Dotta
相关产品推荐
相关产品推荐

