1

R CMD build无论 Rd 文件是否包含,其行为都会有所不同\PR{}。有关宏的详细信息,请参阅编写 R 扩展

Rd 文件不包含的示例\PR{}

$ R CMD build test
* checking for file 'test/DESCRIPTION' ... OK
* preparing 'test':
* checking DESCRIPTION meta-information ... OK
* installing the package to process help pages
* saving partial Rd database
* checking for LF line-endings in source and make files and shell scripts
* checking for empty or unneeded directories
* building 'test_0.1.tar.gz'

Rd 文件包含的示例\PR{}

$ R CMD build test
* checking for file 'test/DESCRIPTION' ... OK
* preparing 'test':
* checking DESCRIPTION meta-information ... OK
* installing the package to process help pages
* saving partial Rd database
* building the PDF package manual      # <- this
Hmm ... looks like a package           # <- this
Converting Rd files to LaTeX           # <- this
Creating pdf output from LaTeX ...     # <- this
Saving output to 'xxx/test.pdf' ...    # <- this
Done                                   # <- this
* checking for LF line-endings in source and make files and shell scripts
* checking for empty or unneeded directories
* building 'test_0.1.tar.gz'

额外的阶段(即building the PDF package manual,在旧计算机上可能会很慢......)是由于在 .build_packages 中调用了..Rd2pdf 第 619-625 行)。但是我不明白是什么触发了这个阶段。此外,它仅对\PR{}其他宏(例如\CRANpkg{}和)触发,而不会触发\doi{}

有人可以追溯发生了什么,为什么?问题仅针对基本 R 函数。我不使用诸如devtools.

最小测试包

封装结构

test
test/man
test/man/one.Rd
test/R
test/R/one.R
test/DESCRIPTION
test/NAMESPACE

test/man/one.Rd

\name{one}
\alias{one}
\title{Get One}
\description{
Rd file containing or not the PR macro:
\PR{1} % comment/uncomment this line as needed
but containing other macros:
\CRANpkg{ggplot2} and \doi{10.1002/wics.147}
}
\usage{
one()
}

test/R/one.R

one <- function() 1

test/DESCRIPTION

Package: test
Version: 0.1
Title: Test
Author: Nobody
Maintainer: Nobody <no@body.org>
Description: Test.
License: GPL-3

test/NAMESPACE

export(one)

构建、检查和安装:

$ R CMD build test
$ R CMD check test_0.1.tar.gz
$ R CMD INSTALL test_0.1.tar.gz
4

2 回答 2

2

这是导致这种差异的机制的解释。

您可以在文件中查看系统宏定义file.path(R.home(), "share/Rd/macros/system.Rd")。的定义\PR

\newcommand{\PR}{\Sexpr[results=rd]{tools:::Rd_expr_PR(#1)}}

你提到的其他人的定义是

\newcommand{\CRANpkg}{\href{https://CRAN.R-project.org/package=#1}{\pkg{#1}}}

\newcommand{\doi}{\Sexpr[results=rd,stage=build]{tools:::Rd_expr_doi("#1")}}

\CRANpkg宏不执行 R 代码,因此不会触发包安装。

宏在\doi构建时执行代码。

在您链接的代码上方,您会看到以下测试

needRefman <- manual &&
        parse_description_field(desc, "BuildManual", TRUE) &&
        any(vapply(db,
                   function(Rd)
                       any(getDynamicFlags(Rd)[c("install", "render")]),
                   NA))

manual变量默认为TRUE,但命令行选项--no-manual将其设置为FALSE。测试的下一部分说您可以通过DESCRIPTION文件中的字段来隐藏手册。

getDynamicFlags()函数在 Rd 文件中查找在安装或渲染时执行的代码,而不是在构建时执行,因此\doi宏不会触发参考手册的构建。

\PR宏没有指定运行时的阶段,并且文档似乎对默认运行时间保持沉默,但显然返回getDynamicFlags(Rd)[c("install", "render")]TRUE它。我猜默认是渲染时间,以防错误数据库的 URL 在 R 的某些未来版本中发生变化。[编辑:文档确实说默认是"install".]

因此,要禁止此构建,请将其BuildManual: false放入DESCRIPTION文件或命令行中。--no-manualR CMD build

于 2022-02-16T13:32:59.667 回答
0

R-core 对R's Bugzilla 的回应:

\PR宏最初仅用于 R 自己的 NEWS.Rd, stage但实际上并不适用。

Sexpr的stage=install默认设置可能有历史原因:构建是后来实现的。我同意这stage=build通常在非基础包中更可取,以避免使用 PDF 手册炸毁 tarball。\doi由于宏,通常会包含部分 Rd db 。

我还没有检查我们是否/如何在不破坏 NEWS.Rd 处理的情况下修改 PR 宏。请注意,WRE 中提到的宏仅作为 \newcommand; 的示例。我不认为它是通用的。在贡献包的帮助下,“PR#”将引用哪个错误跟踪器尚不清楚。在这里简单地将纯 URL 包含到错误报告中可能会更好。

如果你还想使用它,你可以设置\RdOpts{stage=build}在 Rd 文件的开头。(由于Bug 18073 ,这需要 R >= 4.1.0 。)

于 2022-02-17T10:19:33.053 回答