【发布时间】:2012-10-19 17:29:19
【问题描述】:
实际问题
如何避免Rd文件名冲突
- S4 泛型及其方法不一定都定义在同一个包中(包含(某些)自定义方法的包取决于包含泛型的包)和
- 使用roxygen2 包中的
roxygenize()来生成实际的Rd 文件?
我不确定这是roxygen2 问题还是泛型及其方法分散在包中时的常见问题(恕我直言,如果您遵循模块化编程风格)。
处理这些情况的推荐方法是什么?
插图
包装内pkga
假设您在包pkga 中定义了一个通用方法foo,并且您提供了roxygenize() 用来生成Rd 文件的相应roxygen 代码:
#' Test function
#'
#' Test function.
#'
#' @param ... Further arguments.
#' @author Janko Thyson \email{janko.thyson@@rappster.de}
#' @example inst/examples/foo.R
#' @docType methods
#' @rdname foo-methods
#' @export
setGeneric(
name="foo",
signature=c("x"),
def=function(
x,
...
) {
standardGeneric("xFoo")
}
)
当roxygenizing() 您的包时,会在man 子目录中创建一个名为foo-methods.Rd 的文件,该文件用作可能为此通用方法创建的所有方法的参考Rd 文件。到目前为止,一切都很好。如果此泛型的所有方法也是您的包的一部分,那么一切都很好。例如,此 roxygen 代码将确保将文档添加到 foo-methods.Rd 以用于 ANY-foo 的方法:
#' @param x \code{ANY}.
#' @return \code{TRUE}.
#' @rdname foo-methods
#' @aliases foo,ANY-method
#' @export
setMethod(
f="foo",
signature=signature(x="ANY"),
definition=cmpfun(function(
x,
...
) {
return(TRUE)
}, options=list(suppressAll=TRUE))
)
但是,如果包pkga 提供了foo 的泛型,并且您决定在其他一些包(例如pkgb)中为x 添加一个foo 方法x 属于character 类,那么R CMD check 会告诉您 Rd 文件名和/或别名存在名称冲突(因为在 pkga 中已经存在 Rd 文件 foo-methods.Rd):
包装内pkgb
#' @param x \code{character}.
#' @return \code{character}.
#' @rdname foo-methods
#' @aliases foo,character-method
#' @export
setMethod(
f="foo",
signature=signature(x="character"),
definition=cmpfun(function(
x,
...
) {
return(x)
}, options=list(suppressAll=TRUE))
)
更准确地说,这是抛出/写入文件00install.out的错误
Error : Q:/pkgb/man/foo-methods.Rd: Sections \title, and \name must exist and be unique in Rd files
ERROR: installing Rd objects failed for package 'pkgb'
尽职调查
我尝试将@rdname 和@aliases 的值更改为foo_pkgb*(而不是foo*),但\title 和\name 在roxygenizing 时仍设置为foo,因此出现错误遗迹。 除了手动编辑 roxygenize() 生成的 Rd 文件之外还有什么想法吗?
编辑 2012-12-01
鉴于开始赏金,实际问题可能会变得更广泛:
我们如何对 Rd 文件实施某种“包间”检查和/或如何将分散在包中的 S4 方法帮助文件合并到一个 Rd 文件中,以便呈现单个最终用户的参考来源?
【问题讨论】:
标签: r generics package s4 roxygen2