首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确指定S4泛型

正确指定S4泛型
EN

Stack Overflow用户
提问于 2015-09-10 22:44:47
回答 1查看 541关注 0票数 1

对不起,我的无知,但我不知道如何正确地实现S4泛型。过去几个小时我一直在挣扎。希望这是个简单的解决办法。

我试图为我的类定义简单的方法,如printsummary。我试过了一些不同的变体。下面的内容似乎是最接近工作的东西,但显然仍然不恰当。

做这件事的正确方法是什么?我做错了什么?

代码语言:javascript
复制
setClass("foo",
         representation= list(method= "character",
                              mle_iter= "numeric",
                              mle_log_lik= "numeric",
                              data= "list"))


print.foo <- function(obj) {
  cat("\n Method: ", obj@method,
      "\n\n Iterations: ", obj@mle_iter,
      "\n\n Log-Likelihood: ", obj@mle_log_lik)
}

setGeneric("print",
           def= function(obj) {
             print.foo(obj)
             standardGeneric("print")
           })

setMethod("print", signature= "foo",
          function(obj) {
            print(obj)
          })


dat <- as.data.frame(matrix(rnorm(500), ncol=5))

foo1 <- new("foo",
           method= "EM",
           mle_iter= 6,
           mle_log_lik= 1000,
           data= list(dat))

class(foo1)

# this gives me the print that I want; but throws two errors
# other things that I've tried have just done evaluated print.default()
print(foo1)

摘要法

代码语言:javascript
复制
## Summary
setGeneric("summary")

summary.foo <- function(obj) {
  print(obj)

  lapply(obj@data, dim)
}

setMethod("summary", signature= "foo",
  summary.foo)

summary(foo1) # works for this toy example. Doesn't work with my real code
# output for my real example
> Length           Class            Mode 
      1        mod_imputeMulti         S4 

我想这是对我无知的一个简单的修正,但我不确定是什么。提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-11 02:40:47

S4使用show()而不是打印。泛型已经存在。

代码语言:javascript
复制
getGeneric("show")

所以你的工作就是实现一个方法

代码语言:javascript
复制
setMethod("show", "foo", function(object) {
    cat("I'm a foo\n")
})

summary是一个S3泛型,从?Methods中,建议实现S3方法和S4方法

代码语言:javascript
复制
summary.foo <- function(object, ...) {
    ## implement summary.foo
    "I'm a foo"
}

setMethod("summary", "foo", summary.foo)

最后一行的副作用是,基于S4概述的原因,在?Methods上创建了一个S4泛型;显式创建S4泛型可能很有用,

代码语言:javascript
复制
setGeneric("summary")

summary.foo <- function(object, ...) {
    ## implement summary.foo
    "I'm a foo"
}

setMethod("summary", "foo", summary.foo)

在设置方法之前。

如果要实现一个全新的泛型和方法,那么代码将遵循这种模式。

代码语言:javascript
复制
setGeneric("bar", function(x, ...) standardGeneric("bar"))

setMethod("bar", "foo", function(x, ...) {
    ## implement 'bar,foo-method'
})

在这种情况下,不需要创建S3泛型或S3方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32512785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档