天道酬勤,学无止境

'show' 是一个普通的 S4 通用函数吗?(Is 'show' a normal S4 generic function?)

问题
setClass("SCvec", representation(auth = "character", dev = "character", sensor = "character", channel = "character", starttime = "character", endtime = "character"), contains="data.frame") setMethod("show", signature(x="SCvec"), function(x) print(x)) function (object) standardGeneric("show") <bytecode: 0x0396bee8> <environment: 0x0393ab60> Methods may be defined for arguments: object Use showMethods("show") for currently available ones. (This generic function excludes non-simple inheritance; see ?setIs) Error in match.call(definition, call, expand.dots) : unused argument(s) (x = c("SCvec", ""))
回答1
setMethod("show", signature(object="SCvec"), function(object) print(object)) showMethods(show)

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何使用 Roxygen2 在没有通用别名的情况下添加特定于类的别名?(How to add class-specific alias without generic alias using Roxygen2?)
    问题 一个简单的例子是我为show创建了一个扩展,它是一个 S4 基本方法。 我不想通过在我的包中重新记录show来引起歧义分叉,而且我还想合并我的扩展的文档以show在新类myPkgSpClass的文档中,通过为show,myPkgSpClass-method添加别名show,myPkgSpClass-method 。 #' @export #' @aliases show,myPkgSpClass-method #' @rdname myPkgSpClass-class setMethod("show", "myPkgSpClass", function(object){ show(NA) }) 我遇到的问题是,这会在 roxygen2 的文档构建期间产生严重警告, Rd files with duplicated alias 'show':因为在此包中show不止一个类扩展,并且 roxygen2 已自动添加所有相关*-class.Rd文件的别名列表中的通用术语: \alias{show} \alias{show,myPkgSpClass-method} 但是我觉得我不想在任何情况下的通用别名,因为这将迫使需要消歧之间show在我的包,和底座show 。 除了show之外,此问题也适用于从其他包扩展的其他 S4 方法。 如果我将所有特定于类的方法标记到同一个.Rd文件
  • 将S4和S3方法结合在一个函数中(Combining S4 and S3 methods in a single function)
    问题 定义通用功能的好方法是什么?该通用功能应同时具有S3和S4类的实现? 我一直在使用这样的东西: setGeneric("myfun", function(x, ...){ standardGeneric("myfun"); }); setMethod("myfun", "ANY", function(x, ...) { if(!isS4(x)) { return(UseMethod("myfun")); } stop("No implementation found for class: ", class(x)); }); 这样成功了: myfun.bar <- function(x, ...){ return("Object of class bar successfully dispatched."); } object <- structure(123, class=c("foo", "bar")); myfun(object) 有没有一种“本机”的方式来实现这一目标? 我知道我们可以使用setOldClass为S3类定义S4方法,但是如果一个对象有多个类,这样我们就失去了S3方法分派。 例如(在一个干净的会话中): setGeneric("myfun", function(x, ...){ standardGeneric("myfun"); })
  • 为什么对于整数向量 x, as(x, “numeric”) 会触发加载额外的 S4 方法以进行强制?(Why, for an integer vector x, does as(x, “numeric”) trigger loading of an additional S4 method for coerce?)
    问题 虽然我的问题与最近的这个问题有关,但我怀疑它的答案将与 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
  • 显示 R 包中函数的源代码 [重复](show source code for a function in a package in R [duplicate])
    问题 这个问题在这里已经有了答案: 9年前关闭。 可能的重复: R:显示包中 S4 函数的源代码 我下载了一个包( GEOquery )并正在使用一些功能。 其中之一称为Table ,据我所知,它能够制表S4数据集。 例如 > summary(GDS2853) # GDS2853 is a dataset I downloaded from NCBI Length Class Mode 1 GDS S4 getAnywhere(Table)显示 > getAnywhere(Table) A single object matching ‘Table’ was found It was found in the following places package:GEOquery namespace:GEOquery with value function (object) standardGeneric("Table") <environment: 0x06ad5268> attr(,"generic") [1] "Table" attr(,"generic")attr(,"package") [1] "GEOquery" attr(,"package") [1] "GEOquery" attr(,"group") list() attr(,"valueClass")
  • 显示 R 包中函数的源代码 [重复](show source code for a function in a package in R [duplicate])
    问题 这个问题在这里已经有了答案: 9年前关闭。 可能的重复: R:显示包中 S4 函数的源代码 我下载了一个包 ( GEOquery ) 并使用了一些功能。 其中之一称为Table ,据我所知,它能够制表S4数据集。 例如 > summary(GDS2853) # GDS2853 is a dataset I downloaded from NCBI Length Class Mode 1 GDS S4 getAnywhere(Table)显示 > getAnywhere(Table) A single object matching ‘Table’ was found It was found in the following places package:GEOquery namespace:GEOquery with value function (object) standardGeneric("Table") <environment: 0x06ad5268> attr(,"generic") [1] "Table" attr(,"generic")attr(,"package") [1] "GEOquery" attr(,"package") [1] "GEOquery" attr(,"group") list() attr(,"valueClass")
  • 当代码在库中时,使用 S4Vectors do.call 错误“第二个参数必须是一个列表”(do.call error "second argument must be a list" with S4Vectors when the code is in a library)
    问题 这是在另一个上下文中提出的问题:使用列名向量提取并粘贴数据框的多列,如对象 我收到了一个基于do.call用法的答案,当代码是库的一部分时,它碰巧不起作用,但作为主脚本的一部分实现时效果很好。 这是我尝试制作一个简化示例: 文件example.do.call.R : library(S4Vectors) library(test.package) data <- DataFrame(A=letters[1:6], B=LETTERS[1:6]) test_do_paste <- function(data) { groups <- c("A", "B") combined_letters <- do.call(paste, data[groups]) print(combined_letters) } test_do_paste(data) #test.package::test_do_paste(data) 相同的test_do_paste函数作为单个函数出现在我根据 https://hilaryparker.com/2014/04/29/writing-an-r-package-from-scratch/ 组织和安装的包中。 如上所述运行Rscript example.do.call.R ,我获得了预期的结果: [1] "a A" "b B" "c C" "d D" "e
  • 为什么 S4 类的 print 调用 `show` 而没有命名空间?(Why does print of S4 class call `show` without namespacing it?)
    问题 我有一个带有名为show的函数的shinyjs包。 今天,一位用户向我报告说,这在使用 S4 对象时会出现问题,因为“打印”一个 S4 对象使用的是show方法,当它被附加时,它被我的包所掩盖。 例子: library(shinyjs) setClass("testS4Object", representation( ID = "numeric", Name = "character" ), prototype( ID = NA_real_, Name = NA_character_ ) ) x = new("testS4Object") x 有一个错误,因为当我们打印x的值时,它似乎在场景下调用了show ,但它使用的是shinyjs::show而不是methods::show 。 通过显式打印methods::show(x) ,问题就消失了。 但是我有点困惑,为什么默认情况下 S4 打印系统调用show没有命名空间 - 这不是很危险,而且不是我的包的错,这个错误正在发生吗? 在methods中使用与函数同名的函数被认为是一个非常糟糕的主意? 我的想法是S4系统应该知道调用自己的show函数还是继承的S4 show函数。 编辑:我问哈德利他的想法,他似乎也认为这可能是 R 中的一个错误,我给 r-devel 发了电子邮件征求他们的意见 回答1 该问题已报告给 R 核心团队
  • 适用于三星 Galaxy S4 和 Nexus 10 的 Android drawable(Android drawable for Samsung Galaxy S4 and Nexus 10)
    问题 我有一张图片,它是我的应用程序中一个活动的背景。 对于三星 Galaxy S4,此图像应为 1920x1080 并放置在 xxhdpi 文件夹中。 对于 Nexus 10,此图像应为 2560x1600 并放置在 xhdpi 文件夹中。 在 xhpdi 文件夹中放置比在 xxhdpi 文件夹中放置的图像更大的图像是无稽之谈。 因为我相信我误解了一些东西。 有人可以解释我误解了什么吗? - 编辑 - 对于所有质疑nexus10是否真的是xhdpi和S4 xxhdpi的答案: prijupaul 的回答很好,但我没有任何要测试的 Nexus 10 或 Galaxy S4。 我发现尝试为两者创建 AVD 的解决方案,在设备配置创建中,它说明了它将是什么配置。 回答1 资源类“hdpi”、“xhdpi”和“xxhdpi”与分辨率(宽度和高度以普通像素为单位)无关,而与密度(每英寸屏幕的像素数)有关。 S4 的分辨率较低,但密度较高,因为它的屏幕较小。 我认为它在文档(developer.android.com)中有很好的解释。 检查以获取更多详细信息。 回答2 如果分辨率确实很重要,那么您应该使用除 xhdpi 之外的其他限定符。 例如,您可以使用 drawable-sw720dp(针对 10 英寸平板电脑)。 不过,我个人的意见是,您应该为每个宽高比设置一个最大尺寸的版本。
  • 什么是 setReplaceMethod() 以及它是如何工作的?(What is setReplaceMethod() and how does it work?)
    问题 我对setReplaceMethod()的用法感到困惑。 查看?setReplaceMethod并没有提供解释,谷歌搜索也没有帮助。 问题:请解释setReplaceMethod() ,它的用法和它是如何工作的(最好是一个例子)。 回答1 这是我发现的。 正如@Hong Ooi 在评论中指出的 setReplaceMethod setReplaceMethod("fun")与setMethod("fun<-") ,因此setReplaceMethod用于在 R 的 S4 对象系统中创建通用替换函数的方法。 什么是替换函数在 what-are-replacement-functions-in-r 中有解释。 非常粗鲁的是,如果您有一个名为fun<-的函数,因为它的名称以<-结尾,您可以编写fun(x)<-a并且 R 将读取x <- "fun<-"(x,a) 。 S4 对象系统在 S4 - Advanced R 中有描述。 举个例子,从为 S4 泛型函数创建一个方法开始可能更容易,这不是替换函数: ## Define an S4 class 'Polygon' and an object of this class setClass("Polygon", representation(sides = "integer")) p1 <- new("Polygon", sides =
  • Is 'show' a normal S4 generic function?
    I'm trying to create a method for my class, which inherits from data.frame. I was originally hoping just to inherit the 'show' method from data.frame as well, but I'm also fine with writing my own. I defined my class and 'show' method as follows: setClass("SCvec", representation(auth = "character", dev = "character", sensor = "character", channel = "character", starttime = "character", endtime = "character"), contains="data.frame") setMethod("show", signature(x="SCvec"), function(x) print(x)) when I type show in the R console, it prints out: standardGeneric for "show" defined from package
  • R S4 类和 Matrix 包中的重载 + 运算符(Overloading + operator in R S4 classes and Matrix package)
    问题 尝试重载+运算符并将Matrix包与稀疏矩阵一起使用时,我得到了一个奇怪的效果。 我首先定义了一个非常简单的类,它不使用 Matrix 包但有一个+运算符。 然后我对两个稀疏矩阵求和。 第一个M+M加法提供了预期的结果,但第二个会引发错误。 这是一个生成错误的非常简单的代码: require(Matrix) setClass("TestM",representation(M='numeric')) setMethod("initialize", "TestM", function(.Object,x) { .Object@M = x .Object }) setMethod("+", c("TestM","TestM"), function(e1,e2) { e1@M + e2@M }) M = Matrix(diag(1:10),sparse=T) M+M # > FINE M+M # > ERROR M = Matrix(diag(1:10),sparse=F) M+M # > FINE M+M # > FINE 第二次添加会引发以下错误: Error in forceSymmetric(callGeneric(as(e1, "dgCMatrix"), as(e2, "dgCMatrix"))) : error in evaluating the argument 'x'
  • R语言如何面向对象编程—s4类
    文章目录 1 了解R语言类2 S4类创建—setClass()3 S4类的类型检查—setValidity()4 S4类的泛型函数5 S4类的继承 1 了解R语言类 面向对象是一种对现实世界理解和抽象的方法,当代码复杂度增加难以维护的时候,面向对象就会显得非常重要。R主要面向统计计算,而且代码量一般不会很大,几十行,几百行,使用面向过程的编程方法就可以很好地完成编程的任务。 不过,伴随着越来越多的工程背景的人的加入,R语言开始向更多的领域发展。原来的少量的代码的面向过程的编码方式,会越来越难以维护海量代码的项目,所以必须有一种新的编程方式来代码原来的面向过程的编码思路,这种新的编程方式就是面向对象编程(Object Oriented Programming, OOP)。 R语言的类有S3类和S4类,S3类用的比较广,创建简单粗糙但是灵活,而S4类比较精细,具有严格的类结构,从其他语言过来的用户可能会习惯一些。S4对象系统具有明显的结构化特征,更适合面向对象的程序设计。Bioconductor社区,以S4对象系统做为基础架构,只接受符合S4定义的R包。 2 S4类创建—setClass() 由于S4对象是标准的面向对象实现方式, 有专门的类定义 setClass() 和类的实例化函数new()。 setClass函数声明如下: setClass(Class, slots
  • 使用 S3 为“+”方法模拟多个分派 - 可能吗?(emulating multiple dispatch using S3 for “+” method - possible?)
    问题 我有两个类( a和b ),我想为它们定义+方法。 对于这两个类的四种可能组合,我需要不同的方法,即: a + a method 1 a + b method 2 b + a method 3 b + b method 4 我知道我可以使用 S4 进行多次分派,但我想知道是否有办法使用 S3 来模拟这种行为。 我的方法如下: a <- "b" class(a) <- "a" b <- "e" class(b) <- "b" Ops.a <- function(e1, e2){ if (class(e1) == "a" & class(e2) == "a") print("a & a") if (class(e1) == "a" & class(e2) == "b") print("a & b") if (class(e1) == "b" & class(e2) == "a") print("b & a") NULL } a + a a + b b + a 所有这些都可以正常工作,但当然没有定义以下内容。 b + b 现在为了涵盖这种情况,我添加了另一个方法定义。 Ops.b <- function(e1, e2){ if (class(e1) == "b" & class(e2) == "b") print("b & b") NULL } 这将导致b + b工作,但现在a +
  • 在 R 中使用 sd 作为通用函数(Using sd as a generic function in R)
    问题 如果我有一个名为foo的类,那么重载summary函数很简单 summary.foo = function(x, ...) print("bar") 然而,这种技术不适用于sd函数,即 > bar = createFooClass() > sd.foo = function(x, ...) print("Hi") > sd(bar) error: is.atomic(x) is not TRUE 重载这个函数的正确方法是什么? 回答1 您可以劫持任何非通用函数,使其(S3)通用并将原始版本设置为默认版本。 例如: ## make an S3 generic for sd sd <- function(x, ...) UseMethod("sd") ## take the usual definition of sd, ## and set it to be the default method sd.default <- stats::sd ## create a method for our class "foo" sd.foo = function(x, ...) print("Hi") 最后一步,如果这是在一个包中,是添加一个...参数到sd.default以允许通过包检查: formals(sd.default) <- c(formals(sd.default)
  • S4 方法参数的惰性求值(Lazy evaluation for S4 method arguments)
    问题 我正在实现一个包含data.table的 S4 类,并尝试实现[对象的子集(如here所述),以便它也将data.table子集data.table 。 例如(仅定义i子集): library(data.table) .SuperDataTable <- setClass("SuperDataTable", representation(dt="data.table")) setMethod("[", c("SuperDataTable", "ANY", "missing", "ANY"), function(x, i, j, ..., drop=TRUE) { initialize(x, dt=x@dt[i]) }) d = data.table(a=1:4, b=rep(c("x", "y"), each=2)) s = new("SuperDataTable", dt=d) 此时,使用数字向量 ( s[1:2] ) 进行子集化data.table预期工作(它对槽中的data.table进行子集化)。 但是,我想添加使用表达式进行子集化的功能。 这适用于data.table本身: s@dt[b == "x"] # a b # 1: 1 x # 2: 2 x 但不适用于 S4 [方法: s[b == "x"] # Error: object 'b' not found
  • 编写带有两个参数的 S4 泛型方法(Writing an S4 generic method with two arguments)
    问题 我正在尝试使用通用方法定义我自己的 S4 类。 setClass("MultiplyObject", representation(the.factor = "numeric")) # Create a new instance of a class with the "new" method multobj <- new("MultiplyObject", the.factor = 3) # Create a new generic function definition setGeneric("ActOnNumber", function(object, n) { standardGeneric("ActOnNumber", n) }) # Define the ActOnNumber method for the MultiplyObject class setMethod("ActOnNumber", signature(object = "MultiplyObject", n = "numeric"), function(object, n) { object@the.factor * n }) cat(sprintf('ActOnNumber(multobj, 4) = %.2f\n', ActOnNumber(multobj, 4))) 但是
  • 将使用 S3 的包转换为 S4 类,性能会下降吗?(Converting package using S3 to S4 classes, is there going to be performance drop?)
    问题 我有一个 R 包,目前使用S3类系统,有两个不同的类和几种通用 S3 函数的方法,如plot 、 logLik和update (用于模型公式更新)。 由于我的代码在所有有效性检查和if/else结构中变得更加复杂,因为没有基于S3两个参数的继承或分派,我开始考虑将我的包转换为S4 。 但后来我开始阅读S3与S4优缺点,我不再那么确定了。 我在 R-bloggers 博客中找到了关于 S3 与 S4 效率问题的博文,那是 5 年前,我现在测试了同样的东西: library(microbenchmark) setClass("MyClass", representation(x="numeric")) microbenchmark(structure(list(x=rep(1, 10^7)), class="MyS3Class"), new("MyClass", x=rep(1, 10^7)) ) Unit: milliseconds expr structure(list(x = rep(1, 10^7)), class = "MyS3Class") new("MyClass", x = rep(1, 10^7)) min lq median uq max neval 148.75049 152.3811 155.2263 159.8090 323.5678 100 75
  • Taday——类的继承和多态(1)
    一、继承与重写 1.继承 简单的说,继承就是在一个现有类型的基础上,通过增加新的方法或者重定义已有方法(下面会讲到,这种方式叫重写)的方式,产生一个新的类型。继承是面向对象的三个基本特征–封装、继承、多态的其中之一,我们在使用JAVA时编写的每一个类都是在继承,因为在JAVA语言中,java.lang.Object类是所有类最根本的基类(或者叫父类、超类),如果我们新定义的一个类没有明确地指定继承自哪个基类,那么JAVA 就会默认为它是继承自Object类的。 我们可以把JAVA中的类分为以下三种: 类:使用class定义且不含有抽象方法的类。 抽象类:使用abstract class定义的类,它可以含有,也可以不含有抽象方法。 接口:使用interface定义的类。 在这三种类型之间存在下面的继承规律: 类可以继承(extends)类,可以继承(extends)抽象类,可以继承(implements)接口。 抽象类可以继承(extends)类,可以继承(extends)抽象类,可以继承(implements)接口。 接口只能继承(extends)接口。 请注意上面三条规律中每种继承情况下使用的不同的关键字extends和implements,它们是不可以随意替换的。大家知道,一个普通类继承一个接口后,必须实现这个接口中定义的所有方法,否则就只能被定义为抽象类
  • 将日志重新定义为通用时无法修复警告(Can't fix warning when redefining log as a generic)
    问题 我想让log函数成为通用函数,以便我可以在一些newclass下改变它的行为。 我有一个带有描述文件的最小包: Package: logmethod Type: Package Title: A new Log Method Version: 0.1 Date: 2017-03-23 Author: Me Maintainer: Who to complain to <yourfault@somewhere.net> Description: More about what it does (maybe more than one line) License: MIT LazyData: TRUE RoxygenNote: 5.0.1 以及 R 代码,基于我在编写 R 扩展中学到的知识,以及将非 S3 基本函数重新定义为 R 包中的 S3 函数是不是很糟糕? #' @name log_method #' @title A New Log Method #' #' @description A new \code{log} method #' #' @param x a numeric, complex, or measured variable #' @param base a positive or complex measured variable: the base
  • 扩展其他软件包的S4方法时,Rd文件名冲突(Rd file name conflict when extending a S4 method of some other package)
    问题 实际问题 如何避免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") } )