正确指定 S4 泛型
properly specify S4 generics
抱歉我的无知,但我不明白如何正确实施 S4 泛型。过去几个小时我一直在挣扎。希望这是一个简单的修复。
我正在尝试为我的 class 定义简单的方法,例如 print
和 summary
。我在下面尝试了很多不同的变体。下面的内容似乎是最接近工作的,但显然仍然不合适。
正确的做法是什么?我做错了什么?
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)
汇总法
## 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
我认为这是对我无知的简单解决,但我不确定是什么。提前致谢!
S4 使用 show()
而不是打印。泛型已存在
getGeneric("show")
所以你的工作是实现一个方法
setMethod("show", "foo", function(object) {
cat("I'm a foo\n")
})
summary
是 S3 泛型,?Methods
建议实现 S3 方法和 S4 方法
summary.foo <- function(object, ...) {
## implement summary.foo
"I'm a foo"
}
setMethod("summary", "foo", summary.foo)
由于 ?Methods
中概述的原因,最后一行在 "summary" 上创建了一个 S4 泛型作为副作用;显式创建 S4 泛型可能会有用,
setGeneric("summary")
summary.foo <- function(object, ...) {
## implement summary.foo
"I'm a foo"
}
setMethod("summary", "foo", summary.foo)
在设置方法之前。
如果您要实现一个全新的泛型和方法,那么代码将遵循该模式
setGeneric("bar", function(x, ...) standardGeneric("bar"))
setMethod("bar", "foo", function(x, ...) {
## implement 'bar,foo-method'
})
在这种情况下,无需创建 S3 泛型或 S3 方法。
抱歉我的无知,但我不明白如何正确实施 S4 泛型。过去几个小时我一直在挣扎。希望这是一个简单的修复。
我正在尝试为我的 class 定义简单的方法,例如 print
和 summary
。我在下面尝试了很多不同的变体。下面的内容似乎是最接近工作的,但显然仍然不合适。
正确的做法是什么?我做错了什么?
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)
汇总法
## 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
我认为这是对我无知的简单解决,但我不确定是什么。提前致谢!
S4 使用 show()
而不是打印。泛型已存在
getGeneric("show")
所以你的工作是实现一个方法
setMethod("show", "foo", function(object) {
cat("I'm a foo\n")
})
summary
是 S3 泛型,?Methods
建议实现 S3 方法和 S4 方法
summary.foo <- function(object, ...) {
## implement summary.foo
"I'm a foo"
}
setMethod("summary", "foo", summary.foo)
由于 ?Methods
中概述的原因,最后一行在 "summary" 上创建了一个 S4 泛型作为副作用;显式创建 S4 泛型可能会有用,
setGeneric("summary")
summary.foo <- function(object, ...) {
## implement summary.foo
"I'm a foo"
}
setMethod("summary", "foo", summary.foo)
在设置方法之前。
如果您要实现一个全新的泛型和方法,那么代码将遵循该模式
setGeneric("bar", function(x, ...) standardGeneric("bar"))
setMethod("bar", "foo", function(x, ...) {
## implement 'bar,foo-method'
})
在这种情况下,无需创建 S3 泛型或 S3 方法。