对于使用roxygen(2)记录类,指定标题和描述/细节似乎与函数,方法,数据等相同.但是,插槽和继承是它们自己的动物类型.在roxygen2中记录S4类的最佳实践 - 当前或计划的最佳实践是什么?
尽职调查:
我@slot在早期的roxygen描述中发现了一个标签.
2008 R-forge邮件列表帖
似乎表明这已经死了,并且没有对@slotroxygen的支持:
roxygen2是真的吗?前面提到的帖子建议用户应该使用LaTeX标记创建自己的逐项列表.例如,扩展"character"该类的新S4类将被编码并记录如下:
#' The title for my S4 class that extends \code{"character"} class.
#'
#' Some details about this class and my plans for it in the body.
#'
#' \describe{
#' \item{myslot1}{A logical keeping track of something.}
#'
#' \item{myslot2}{An integer specifying something else.}
#'
#' \item{myslot3}{A data.frame holding some data.}
#' }
#' @name mynewclass-class
#' @rdname mynewclass-class
#' @exportClass mynewclass
setClass("mynewclass",
representation(myslot1="logical",
myslot2="integer",
myslot3="data.frame"), …Run Code Online (Sandbox Code Playgroud) 有谁知道R中的插槽是什么?
我没有找到其含义的解释.我得到一个递归定义:"Slot函数返回或设置有关对象的各个槽的信息"
感谢帮助,谢谢 - 胡同
我在专业环境中定期在R中编程,我也为客户或同事编写包.这里的一些程序员具有Java背景,并坚持使用S4方法以面向对象的方式做所有事情.另一方面,我的经验是,在尝试让代码按照您希望的方式执行操作时,S4实现通常会更糟,并且会导致更多的麻烦.
我绝对同意,在某些情况下,您必须能够以受控方式构造复杂对象或附加现有对象.但大多数时候,S4实现也可以使用经典列表轻松完成,没有像定义standardGeneric,方法,构造函数,初始化器等那样麻烦.
你什么时候考虑为R编写S4实现?
编辑:为了清楚起见,我非常感谢R.OOP中的答案和关于OO的讨论可以在R中以多种方式完成,但我的问题实际上是针对特定使用S4方法的附加值.
如何避免Rd文件名冲突
roxygenize()包roxygen2生成实际的Rd文件?roxygen2当通用及其方法分散在各个包中时,我不确定这是一个问题还是一个常见问题(如果遵循模块化编程风格,恕我直言肯定是一个真实的用例场景).
处理这些情况的推荐方法是什么?
在包中 pkga
假设在包中pkga你定义了一个通用方法foo,并且你已经提供了相应的roxygen代码来roxygenize()获取生成Rd文件:
#' 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")
}
)
Run Code Online (Sandbox Code Playgroud)
当roxygenizing()您的包时,foo-methods.Rd在man子目录中创建一个调用的文件,该子目录充当可能为此泛型方法创建的所有方法的引用Rd文件.到现在为止还挺好.如果这个通用的所有方法也是你的包的一部分,一切都很好.例如,这个roxygen代码将确保foo-methods.Rd为以下ANY方法添加文档foo:
#' @param x …Run Code Online (Sandbox Code Playgroud) 我已经在SO和其他地方看到了一些关于在未来版本的Roxygen2中应该如何或将要完成的讨论.但是,我被卡住了.我应该如何使用Roxygen2记录S4泛型及其方法?一个全新的通用/方法的工作示例,以及扩展基础S4通用的示例将非常有用.我不想为同一个泛型的每个S4方法制作单独的(大多数)冗余文档.
尽职调查:我已经找到了"提取"方法的有用示例.但是,对于我的问题,它似乎已经过时且不完整.它在类文档中使用@slot标记,但不支持(不再?).它仅显示了核心S4方法"["的扩展,而不是包含S4泛型文档的完整Roxygen示例.
如何正确记录S4"["和"[< - "方法使用roxygen?
如果我用标题,描述完全记录一个新的S4泛型@param @return @name @aliases
@docType @rdname,然后用相应的文档记录S4方法@name @aliases
@docType @rdname,我得到以下R CMD check警告:
* checking for missing documentation entries ... WARNING
Undocumented S4 methods:
<< long list of apparently undocumented methods. E.g. generic 'plot' and siglist 'myClass1,ANY' >>
All user-level objects in a package (including S4 classes and methods)
should have documentation entries.
Run Code Online (Sandbox Code Playgroud)
它首先看起来好像我用这种方式用roxygen2记录的S4方法都没有实际工作.但是,到目前为止,我注意到我的核心方法"show"的扩展没有相关的错误,即使它们的记录方式与其他方法完全相同.以下是我在其中一个show方法中包含的完整roxygen文档的示例,它没有生成遗漏文档错误:
#' @name show
#' @aliases show,myClass2-method
#' @docType methods
#' @rdname show-methods
Run Code Online (Sandbox Code Playgroud)
因此,我很茫然.如您所见,我已经包含了R包手册的S4文档部分中描述的S4方法的别名约定,即方法应该具有以下名称的别名(没有空格):
generic,signature_list-method.
Run Code Online (Sandbox Code Playgroud)
不知何故,这并没有被完全理解 …
虽然我的问题与最近的问题有关,但我怀疑它的答案与R S4对象系统的详细工作方式有关.
(TLDR; - 所有指示都as(4L, "numeric")应该发送到一个函数,它的身体as.numeric(4L)用来将它转换为一个"numeric"向量.)
每当as(object, Class)用户将对象转换为所需对象时Class,就会触发对幕后调用coerce().coerce()反过来,有一堆方法根据函数调用的签名调度 - 这里是第一个和第二个参数的类.要查看所有可用S4 coerce()方法的列表,可以运行showMethods("coerce").
这样做表明只有一种方法可以转换为类"numeric".这是签名的from="ANY", to="numeric":
showMethods("coerce")
# Function: coerce (package methods)
# from="ANY", to="array"
# ... snip ...
# from="ANY", to="numeric"
# ... snip ...
Run Code Online (Sandbox Code Playgroud)
该方法用于as.numeric()执行其转换:
getMethod("coerce", c("ANY", "numeric"))
# Method Definition:
#
# function (from, to, strict = TRUE)
# {
# value <- …Run Code Online (Sandbox Code Playgroud) 基本上,当setMethodor或(setGeneric)中存在许多参数时,它的工作速度非常慢.
这是一个基本的例子:
setClassUnion(name = "mNumeric", members = c("missing", "numeric"))
setClass(Class = "classA", representation = representation(ID = "character"))
setGeneric("foo", function(r, i, ..., m = 1, D = 1, U = 999, K = 0.005,
E1 = -5, E2 = 5, E3 = 1, E4 = 1, E5 = 1, E6 = 1,
A1 = -5, A2 = 5, A3 = 1, A4 = 1, A5 = 1, A6 = 1)
{standardGeneric ("foo")})
setMethod(f = "foo",
signature = …Run Code Online (Sandbox Code Playgroud) 由于我经常遇到需要S4编程来保持概述的情况,我收集了很多关于S4对象,方法和编程的资料.我在这里列出了它们作为参考.请添加您自己的来源.
在网上
methods帮助文件:从包装方法中,很多必要的信息都可以找到帮助文件图书
PS:如果有人找到社区复选框,您可以将其设为社区拥有的帖子.不知何故,我再也无法在编辑窗口中找到它......
我使用R中的topGO包来分析基因富集,使用以下代码:
sampleGOdata <- new("topGOdata", description = "Simple session", ontology = "BP",
allGenes = geneList, geneSel = topDiffGenes, nodeSize = 10,
annot = annFUN.db, affyLib = affyLib)
resultFisher <- runTest(sampleGOdata, algorithm = "classic", statistic = "fisher")
allRes <- GenTable(sampleGOdata, classicFisher = resultFisher, orderBy = "fisher",
ranksOf = "classicFisher",topNodes = 10)
Run Code Online (Sandbox Code Playgroud)
我想看到和更改的RunTest功能和GenTable更改的功能ResultTable,但我不知道如何表达的功能.随着getAnywhere("GenTable")我没有得到我想要的硬代码.
getAnywhere("GenTable")
Run Code Online (Sandbox Code Playgroud)
找到了匹配"GenTable"的单个对象
它在以下地方被发现
Run Code Online (Sandbox Code Playgroud)package:topGO namespace:topGO有价值的
Run Code Online (Sandbox Code Playgroud)function (object, ...) standardGeneric("GenTable") <environment: 0x16a30c10> attr(,"generic") [1] "GenTable" attr(,"generic")attr(,"package") [1] "topGO" attr(,"package") [1] "topGO" attr(,"group") …