如何使用 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
上的预期行为是:
- 使用
make4ht
创建插图 foo.html
的 HTML 版本
- 直接在 R 包根目录下为它创建一个名为
outputs
的目录
- 将 HTML 文件移到那里
- 正确创建 PDF 插图
- 清理 .tex 文件以避免重复插图条目的错误
然后在生成的 tarball 的 R CMD INSTALL
上,我希望在安装包下找到一个目录 outputs
,其中包含文件 foo.html
。然而,情况并非如此——那里有 PDF 和源小插图,但没有 outputs
.
的迹象
我了解将软件包安装到临时目录是为了构建小插图。我假设 none 写入此临时位置的文件实际上已合并到最终包中,但 vignettes/*.pdf
或 vignettes/*.html
等文件除外。因此,在这种情况下,让我重复我的问题:
是否可以使用 vignettes 创建(任意)文件以包含在包中?
我知道所有这些都可以在构建包之前完成,将文件放在 inst
下的某个地方。但如果可能的话,我更愿意一步完成所有这一切;小插曲记录了数据分析的各个方面,我想在最终包中提供此分析的输出,因此这似乎是一个自然的工作流程。
我很确定你不能那样做,而且尝试也没有意义。 Vignettes 应该 运行 能够被用户复制你得到的结果,或者做一些小的改变看看它们是如何工作的。用户不应期望更改包的内容。
如果您希望 vignette 为用户生成文件,它们应该默认位于临时目录中,这样它们就不会对用户的文件系统进行永久更改。
我认为您最后一段中的方法是唯一可行的方法。在构建包之前,您 运行 一些 Makefile,也许它 运行 是将文件安装到 inst
某处的小插图。一种方法是让您的小插图查看环境变量以找到它放置文件的目的地。您的 Makefile 可以在处理小插图之前设置环境变量。但是,如果用户(或 R CMD build
系统)运行 在没有该环境变量的情况下使用您的小插图,则不会生成文件,或者将在 运行 结束时将其删除。
如何(如果有的话)使用 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
上的预期行为是:
- 使用
make4ht
创建插图 - 直接在 R 包根目录下为它创建一个名为
outputs
的目录 - 将 HTML 文件移到那里
- 正确创建 PDF 插图
- 清理 .tex 文件以避免重复插图条目的错误
foo.html
的 HTML 版本
然后在生成的 tarball 的 R CMD INSTALL
上,我希望在安装包下找到一个目录 outputs
,其中包含文件 foo.html
。然而,情况并非如此——那里有 PDF 和源小插图,但没有 outputs
.
我了解将软件包安装到临时目录是为了构建小插图。我假设 none 写入此临时位置的文件实际上已合并到最终包中,但 vignettes/*.pdf
或 vignettes/*.html
等文件除外。因此,在这种情况下,让我重复我的问题:
是否可以使用 vignettes 创建(任意)文件以包含在包中?
我知道所有这些都可以在构建包之前完成,将文件放在 inst
下的某个地方。但如果可能的话,我更愿意一步完成所有这一切;小插曲记录了数据分析的各个方面,我想在最终包中提供此分析的输出,因此这似乎是一个自然的工作流程。
我很确定你不能那样做,而且尝试也没有意义。 Vignettes 应该 运行 能够被用户复制你得到的结果,或者做一些小的改变看看它们是如何工作的。用户不应期望更改包的内容。
如果您希望 vignette 为用户生成文件,它们应该默认位于临时目录中,这样它们就不会对用户的文件系统进行永久更改。
我认为您最后一段中的方法是唯一可行的方法。在构建包之前,您 运行 一些 Makefile,也许它 运行 是将文件安装到 inst
某处的小插图。一种方法是让您的小插图查看环境变量以找到它放置文件的目的地。您的 Makefile 可以在处理小插图之前设置环境变量。但是,如果用户(或 R CMD build
系统)运行 在没有该环境变量的情况下使用您的小插图,则不会生成文件,或者将在 运行 结束时将其删除。