如何使用 vignette 向 R 包添加任意内容?

How to add arbitrary content to R package using vignette?

如何(如果有的话)使用 R 包 vignettes 生成任意文件以包含在已安装的包中?

我今天一直在研究两个具体的用例和方法。

首先,我有一个模板 Excel 文件,我希望用从 (Sweave) 小插图中派生的数据填充它,然后在包中提供这个修改后的 Excel 文件(与模板一起).按照约定,模板在源码包的inst/extdata目录下;小插图包含一些代码,这些代码使用 system.file 读取它,然后将修改后的副本写回同一目录。然而,虽然小插图(和包)使用 R CMD build 成功构建,但在 tarball 的 R CMD INSTALL 之后,已安装包的 extdata 目录不包含修改后的文件,仅包含模板。

第二个用例更一般,涉及 Makefile。我想将 .tex 文件中的小插图渲染为 PDF 和 HTML 格式。我想使用 make4ht 创建的 HTML 版本实际上是由另一个应用程序提供的,而不是在包 本身 中使用;因此我不希望它们与 PDF 插图一起放在 doc 目录中——我们将它们放在 outputs.

目前我正在尝试为此目的使用 Makefile。在源码包的 vignettes 目录中,我有一个非常基本的 Makefile,如下所示:

all : foo.tex
    make4ht foo.tex
    mkdir ../outputs
    mv foo.html ../outputs
    texi2pdf foo.tex
    rm foo.tex

R CMD build 上的预期行为是:

  1. 使用 make4ht
  2. 创建插图 foo.html 的 HTML 版本
  3. 直接在 R 包根目录下为它创建一个名为 outputs 的目录
  4. 将 HTML 文件移到那里
  5. 正确创建 PDF 插图
  6. 清理 .tex 文件以避免重复插图条目的错误

然后在生成的 tarball 的 R CMD INSTALL 上,我希望在安装包下找到一个目录 outputs,其中包含文件 foo.html。然而,情况并非如此——那里有 PDF 和源小插图,但没有 outputs.

的迹象

我了解将软件包安装到临时目录是为了构建小插图。我假设 none 写入此临时位置的文件实际上已合并到最终包中,但 vignettes/*.pdfvignettes/*.html 等文件除外。因此,在这种情况下,让我重复我的问题:

是否可以使用 vignettes 创建(任意)文件以包含在包中?

我知道所有这些都可以在构建包之前完成,将文件放在 inst 下的某个地方。但如果可能的话,我更愿意一步完成所有这一切;小插曲记录了数据分析的各个方面,我想在最终包中提供此分析的输出,因此这似乎是一个自然的工作流程。

我很确定你不能那样做,而且尝试也没有意义。 Vignettes 应该 运行 能够被用户复制你得到的结果,或者做一些小的改变看看它们是如何工作的。用户不应期望更改包的内容。

如果您希望 vignette 为用户生成文件,它们应该默认位于临时目录中,这样它们就不会对用户的文件系统进行永久更改。

我认为您最后一段中的方法是唯一可行的方法。在构建包之前,您 运行 一些 Makefile,也许它 运行 是将文件安装到 inst 某处的小插图。一种方法是让您的小插图查看环境变量以找到它放置文件的目的地。您的 Makefile 可以在处理小插图之前设置环境变量。但是,如果用户(或 R CMD build 系统)运行 在没有该环境变量的情况下使用您的小插图,则不会生成文件,或者将在 运行 结束时将其删除。