由于我经常遇到需要进行S4编程的情况,所以我已经收集了很多关于S4对象,方法和编程的资料。 我把它们列在这里作为参考。 请添加您自己的来源。 在网上 这些methods帮助文件 :来自包方法的帮助文件,其中可以find许多必要的信息 在15页的S4类 :简短介绍与S4对象的编程。 S4方法是如何工作的 :更多关于底层机制的解释。 对S4的简短介绍 :用实际的例子来说明如何构build类和一些有用的技巧。 它包含一个方便的概述作为附录,但也包含错误。 应该小心使用这一个。 R中的面向对象 :S3和S4上的实例 S4对象 :Thomas Lumley关于S4对象的介绍。 R面向对象编程 :深入介绍R中面向对象编程。它涵盖了S3,S4和S4参考类。 随附的序列包实现了整个幻灯片中使用的类系统。 图书 数据分析软件 – 与R编程(J.Chambers):一个经典的,虽然没有审查积极的地方,其中包含了一个关于S4 R编程生物信息学(R. Gentleman):专门针对与完全基于S4的Bioconductor合作。 但它提供了一个广泛的概述,也是很多其他人有用的。 PS:如果有人find社区checkbox,可以将其设为社区拥有的post。 不知何故,我无法再在编辑窗口中find它…
基本上,当setMethod或( 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 = […]
虽然我的问题与最近的问题有关,但我怀疑它的答案将与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 … 该方法使用as.numeric()来执行转换: getMethod("coerce", c("ANY", "numeric")) # Method Definition: # # function (from, to, strict = […]
我想在R中创build一个类,我应该使用S3还是S4类? 我读了很多关于他们的不同的东西,有一个比另一个更优越吗?
我已经在SO和其他地方看到了一些关于Roxygen2未来版本应该如何实现的讨论。 但是,我卡住了。 我应该如何使用Roxygen2来logging一个S4generics以及它的方法? 一个全新的通用/方法的工作示例,以及扩展基本S4通用的例子将是非常有用的。 我不想为同一个通用的每个S4方法做单独的(大部分)冗余文档。 尽职调查:我已经find了“提取”方法的一个有用的例子。 但是,我的问题似乎已经过时和不完整。 它在类文档中使用@slot标签,不支持(不再支持)。 它只显示了核心S4方法的扩展“[”,而不是一个完整的Roxygen例子,包括S4通用的文档。 如何正确loggingS4“[”和“[< – ”使用roxygen的方法? 如果我完整地logging了一个带有标题的新的S4generics,描述@param @return @name @aliases @docType @rdname ,然后用相应的@name @aliases @docType @rdnameloggingS4方法,我得到下面的R CMD check警告: * checking for missing documentation entries … WARNING Undocumented S4 methods: << long list of apparently undocumented methods. Eg generic 'plot' and siglist 'myClass1,ANY' >> All user-level objects in a package […]
实际的问题 如何避免Rd文件名称冲突 一个S4generics和它的方法不一定全都在同一个包中定义(包含(一些)定制方法的包依赖于包含generics的包) 使用roxygenize()包中的roxygenize()生成实际的Rd文件? 我不确定这是一个roxygen2问题还是一个普通的问题,当generics和它的方法分散在不同的包(如果你遵循一个模块化的编程风格,一般来说,恕我直言,一定是一个现实的用例场景)。 build议如何处理这些情况? 插图 在包pkga 假设在包pkga你定义了一个通用方法foo ,并且你已经提供了roxygenize()拾取的相应roxygen代码来生成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") } ) 当roxygenizing()你的包时,一个名为foo-methods.Rd的文件被创build在man子目录中,作为可能为这个generics方法创build的所有方法的参考Rd文件。 到现在为止还挺好。 如果这个通用的所有方法也是你的包的一部分,一切都很好。 例如,这个roxygen代码将确保将文档添加到foo-methods.Rd用于foo-methods.Rd的ANY方法: #' […]
有谁知道什么是在R插槽? 我没有find它的意义的解释。 我得到一个recursion的定义:“槽function返回或设置对象的单个插槽的信息” 帮助将不胜感激,谢谢 – 胡同
我在专业环境下定期在R编程,并为客户或同事编写软件包。 这里的一些程序员有一个Java背景,并坚持使用S4方法做所有面向对象的方法。 另一方面,我的经验是,S4的实现往往performance得更差,并且在试图让代码做你想做的事情时会引起更多的头痛。 我绝对同意,在某些情况下,您必须能够以受控方式构造复杂对象或追加现有对象。 但大多数情况下,S4实现可以很容易地使用经典列表来完成,而没有像定义标准generics,方法,构造函数,初始化程序等这样的麻烦。 你什么时候考虑为R编写S4实现? 编辑:为了清楚起见,我很欣赏答案和有关面向对象的一般讨论在OOP可以在R中以多种方式完成,但我的问题是真正针对使用S4方法的附加价值具体。
为了用roxygen(2)logging类,指定标题和描述/细节看起来与函数,方法,数据等相同。然而,插槽和inheritance是它们自己的一种动物。 目前或计划的最佳做法是如何loggingroxygen2中的S4课程? 尽职调查: 我在早期的roxygen描述中发现了一个@slot标签。 2008 R-forge邮件列表post似乎表明这已经死了,并且在@slot中不支持@slot: roxygen2是真的吗? 前面提到的postbuild议用户应该用LaTeX标记制作自己的分项列表。 例如,扩展"character"类的新的S4类将被编码和logging如下: #' 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 […]