标签: s4

如何使用Roxygen2正确记录S4类插槽?

对于使用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 class slot s4 roxygen2

302
推荐指数
3
解决办法
1万
查看次数

R:什么是老虎机?

有谁知道R中的插槽是什么?

我没有找到其含义的解释.我得到一个递归定义:"Slot函数返回或设置有关对象的各个槽的信息"

感谢帮助,谢谢 - 胡同

oop r slot s4 r-faq

75
推荐指数
3
解决办法
3万
查看次数

什么时候在R编程中使用S4方法是有回报的

我在专业环境中定期在R中编程,我也为客户或同事编写包.这里的一些程序员具有Java背景,并坚持使用S4方法以面向对象的方式做所有事情.另一方面,我的经验是,在尝试让代码按照您希望的方式执行操作时,S4实现通常会更糟,并且会导致更多的麻烦.

我绝对同意,在某些情况下,您必须能够以受控方式构造复杂对象或附加现有对象.但大多数时候,S4实现也可以使用经典列表轻松完成,没有像定义standardGeneric,方法,构造函数,初始化器等那样麻烦.

你什么时候考虑为R编写S4实现?

编辑:为了清楚起见,我非常感谢R.OOP中的答案和关于OO的讨论可以在R中以多种方式完成,但我的问题实际上是针对特定使用S4方法的附加值.

oop methods r s4

68
推荐指数
7
解决办法
4529
查看次数

扩展某个其他包的S4方法时,Rd文件名冲突

实际问题

如何避免Rd文件名冲突

  1. 一个S4通用及其方法(或多个)必然全部在相同的包中定义(含有(部分的)自定义方法(一个或多个)软件包依赖于包含所述通用包)
  2. 使用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.Rdman子目录中创建一个调用的文件,该子目录充当可能为此泛型方法创建的所有方法的引用Rd文件.到现在为止还挺好.如果这个通用的所有方法也是你的包的一部分,一切都很好.例如,这个roxygen代码将确保foo-methods.Rd为以下ANY方法添加文档foo:

#' @param x …
Run Code Online (Sandbox Code Playgroud)

generics r package s4 roxygen2

58
推荐指数
1
解决办法
2130
查看次数

R中的类:S3 vs S4

我想在R中创建一个类,我应该使用S3还是S4类?

我读了很多关于它们的不同的东西,有一个优于另一个吗?

r class s4

52
推荐指数
2
解决办法
2万
查看次数

如何使用roxygen2正确记录S4方法

我已经在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)

不知何故,这并没有被完全理解 …

generics methods r s4 roxygen2

48
推荐指数
2
解决办法
8853
查看次数

为什么,对于整数向量x,为(x,"numeric")触发加载强制的附加S4方法?

虽然我的问题与最近的问题有关,但我怀疑它的答案与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)

r s4

41
推荐指数
1
解决办法
761
查看次数

当setMethod(或setGeneric)中的参数太多时,R挂起

基本上,当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)

methods r dispatch s4

40
推荐指数
1
解决办法
419
查看次数

R中S4对象,方法和编程的来源

由于我经常遇到需要S4编程来保持概述的情况,我收集了很多关于S4对象,方法和编程的资料.我在这里列出了它们作为参考.请添加您自己的来源.

在网上

图书

  • 用于数据分析的软件 - 使用R编程(J. Chambers):一个经典的,虽然没有在各处评论,但是包含S4的大部分内容
  • 生物信息学的R编程(R. Gentleman):专门针对与Bioconductor合作,完全基于S4.但它提供了广泛的概述,对许多其他人也很有用.

PS:如果有人找到社区复选框,您可以将其设为社区拥有的帖子.不知何故,我再也无法在编辑窗口中找到它......

r reference manual s4

39
推荐指数
1
解决办法
6469
查看次数

如何在包中显示S4功能的源代码?

我使用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"的单个对象

它在以下地方被发现

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") …
Run Code Online (Sandbox Code Playgroud)

packages r s4

36
推荐指数
2
解决办法
1万
查看次数

标签 统计

r ×10

s4 ×10

methods ×3

roxygen2 ×3

class ×2

generics ×2

oop ×2

slot ×2

dispatch ×1

manual ×1

package ×1

packages ×1

r-faq ×1

reference ×1