【问题标题】:How does an S3 object invoke a method?S3 对象如何调用方法?
【发布时间】:2022-01-05 12:52:36
【问题描述】:

我一直在努力发展我的 S3 学习。我在这里正确使用了object 吗?我想创建一个 summaryprintplot 类。我目前正在使用 t 检验,但函数本身并不重要 - 正确获取 S3 代码。

注意:我已经阅读了我能找到和推荐的所有内容——但由于他们一直在使用 sloop 或 lm,我只是不明白什么是独特的或这些包中包含什么——我想从头开始构建。谢谢

library(gapminder)
library(dplyr)
library(ggplot2)

head(gapminder)
str(gapminder)

part3 <- gapminder
Asia1 <- subset(part3, continent == "Asia")
Africa1 <- subset(part3, continent =="Africa")
part3c <- rbind(Asia1, Africa1)

summary.part3s3b <-function(part3g) {
  cat('The following should give t-test results:\n')
  part3g <- t.test(data = part3c,
                   lifeExp ~ continent)
  part3g
}
summary(part3g)

【问题讨论】:

  • 我认为您误解了“sloop”包的意义:它在 Advanced R 中纯粹用作调查工具,以帮助解释 S3。它不用于使用 S3编写代码

标签: r object plot summary r-s3


【解决方案1】:

我们定义了一个构造函数来创建 part3s3b 对象和一个 summary 和 plot 方法。 summary 方法创建了一个类 summary.part3s3b 的对象,它有一个 print 方法。然后我们测试一下。再看看 lm、print.lm、plot.lm、summary.lm、print.summary.lm 的另一个例子。

# construct a part3s3b object
part3s3b <- function(x, ...) {
  structure(x, class = c("part3s3b", setdiff(class(x), "part3s3b")))
}

# construct summary.part3s3b object which is an htest with 
#  a c("summary.part3s3b", "htest") class
summary.part3s3b <- function(object, ...) {
  y <- t.test(data = object, lifeExp ~ continent)
  structure(y, class = c("summary.part3s3b", "htest"))
}

# same as print.htest except it also displays a line at the beginning
print.summary.part3s3b <-function(x, ...) {
  cat('The following should give t-test results:\n')
  NextMethod()
}

plot.part3s3b <- function(x, ...) {
  cat("plotting...\n")
  NextMethod()
}

# test    
X <- part3s3b(part3c)  # create part3s3b object X
summary(X)  # run summary.part3s3b and print.summary.part3s3b
plot(X)  # run plot.part3s3b

【讨论】:

  • plot.part3s3b 有必要吗?由于它只是调度到“父类”方法,因此省略它应该具有相同的效果。
  • 这里没有必要,但问题表明具体功能无关紧要。我将在其中添加一只猫,所以为了清楚起见,它并不相同。
  • @KonradRudolph 谢谢!!我要努力解决这个问题! NextMethod() 对我来说是一个新的,我将在 SO 上寻找有关如何理解它的信息!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-12
  • 2012-01-25
  • 2014-04-12
  • 2016-02-11
  • 1970-01-01
  • 2016-06-08
  • 2014-03-08
相关资源
最近更新 更多