扩展其它的什么包的S4方法当RD文件名冲突(Rd file name conflict when e

2019-07-03 11:21发布

实际问题

如何避免路文件名冲突时

  1. 一个S4通用的和其方法(一个或多个) 不必都在同一个包中定义(含有(部分的)自定义方法(一个或多个)软件包依赖于包含所述通用包),并
  2. 使用roxygenize()从包装roxygen2产生实际Rd文件?

我不知道这是否是一个roxygen2问题或当通用和它的方法(S)已遍布包(恕我直言,一般来说,绝对是一个现实的用例场景,如果你遵循模块化编程风格)的共同问题。

什么是处理这些情况的推荐的方法?

插图

在包pkga

假设在包pkga你定义一个通用的方法foo以及您提供的相应的roxygen代码roxygenize()拿起生成路文件:

#' 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()你的包,一个名为foo-methods.Rd的创建man子目录用作可能把这个通用方法创建的所有方法的参考文件路。 到现在为止还挺好。 如果所有这个通用的方法也是你的包,一切都很好的一部分。 例如,这roxygen代码将确保该文件被添加到foo-methods.RdANY的-方法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 )添加foo -方法为x类的福利character ,那么R CMD check会告诉你,有一个名称冲突相对于路的文件名和/或别名(因为已经有一个RD文件foo-methods.Rdpkga ):

在包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@aliasesfoo_pkgb* (而不是foo* ),但\title\name仍然被设置为foo roxygenizing时,因此错误仍然存在。 任何想法除了手动编辑所产生的Rd文件 roxygenize()


编辑2012年12月1日

在开始赏金的光,实际问题可能会得到一个稍宽的味道:

我们怎样才能实现某种形式的“跨包”检查相对于Rd文件和/或我们如何才能巩固,以目前的参考单一来源到最后散落在封装成一个单一的路文件S4方法帮助文件-用户?

Answer 1:

基本的问题确实是“roxygenize” - 只。 这就是为什么我从来没有见过的问题。

尽管有充分的理由对包装发展的roxygenizing办法,我仍然看到一个很好的理由不要去那里:

恳求少得多极端roxygenation

所得到的帮助页面倾向于看无聊至极 ,不仅自动生成的* .Rd文件,而且所呈现的结果。 例如

  1. 实例往往很小,不包含注释,往往不能很好的格式化(使用空间,/新线/ ..)
  2. 数学问题通过\等式{}或\ deqn {}很少解释
  3. \描述{..}和类似更高级别格式很少使用

这是为什么? 因为

1)阅读和编辑roxygen评论是这么多“累赘”,或者至少在视觉上收效甚微比阅读和编辑* .Rd文件ESS或Rstudio或(其他IDE具有* .Rd支持内置)

2)如果您所使用的文档

是,在您的包建筑/检查结束时自动生成的东西

您通常往往不会considerung写得很好R文件为一些重要的事情(而你的R代码里面,这是所有的文档只是一个评论:-)

结果一切:人们更喜欢写文档关于他们的插图功能,甚至博客,github上学家,YouTube视频或...它是在创作的时候很漂亮,但几乎从代码和绑定分离让过时的和枯萎(因此,通过谷歌搜索会误导用户) - >有在同一地点代码和文档的roxygen的原始动机是完全击败。

我喜欢roxygen和我创建一个新的功能时广泛使用它...我不断和长时间保持它作为我的功能在一个包, 或者没有出口。 有一次,我决定要出口的话,我跑(ESS的当量)roxygenize() 一次 ,从此把保持其良好格式化的* .Rd文件的小的额外负担 ,包含自己的意见(我作为作者) ,有很多很好的例子,有它自己的版本控制(GIT / SVN / ...)历史等



Answer 2:

我设法生成命名空间和* .Rd文件S4方法在另一个包比我定义泛型。

我花了以下步骤:

  1. 手动创建一个命名空间的解决方法,一个已知的roxygen2错误 。

    手工编写一个命名空间也不是那么困难!

    在RStudio roxygen2关闭NAMESPACE代:

     Build > more > Configure build tools > configure roxygen > do not use roxygen2 to generate NAMESPACE. 
  2. 导入包含通用包装,并使用exportMethods导出S4方法 。

  3. 写为每个S4方法单独roxygen2文档。 请勿将roxygen2文件(如我一般做同一个通用的方法不同)。

  4. 明确roxygen标签@title和@description加入的S4方法roxygen文档。 写@description明确,即使它的值是@title相同。

这使得它为我工作。



文章来源: Rd file name conflict when extending a S4 method of some other package