S3类的默认元素

时间:2013-03-06 06:35:06

标签: r r-s3

我想知道R中的S3类,如果有一个选项来定义默认输出元素并保持其余元素隐藏。举个例子,假设我们有一个玩具函数来计算某些东西并将它们报告为S3类,如下所示:

toy <- function(x){
  resA <- mean(x)
  resB <- length(x)

  output <- list(resA=resA, resB=resB, x=x)
  class(output) <- "toy"
  output
}

我们现在通过

访问结果
res <- toy(c(1:10))
res

我们将整个列表作为输出,正如预期的那样。但是,如果我们定义一个S3打印方法

`print.toy` <- function(x){
  print(x$resA)
}

我们可以为隐藏不必要信息的打印提供标准输出(在这种情况下为resBx),用户只能看到resA。但是,当您想对类toy的对象应用进一步的计算时,这可能会引起一些混淆,例如

res <- toy(c(1:10))
res 
# Produces an error
res + 1 
# Accesses the correct variable of class toy:
res$resA + 1

现在我的问题是,有没有办法将列表项resA定义为S3类的标准值,如果未指定变量则应该采用该类,以便res + 1调用会有效吗?

感谢您阅读本文。

2 个答案:

答案 0 :(得分:4)

一种方法是使用向量+属性而不是列表。如果您有一个主要数据片段应该像常规向量一样工作,并且还有一些额外的元数据,那么这是最合适的。

toy <- function(x) {
  resA <- mean(x)
  resB <- length(x)

  structure(resA, x = x, b = resB, class = "toy")
}
print.toy <- function(x, ...) {
  print(as.vector(x))
}
t <- toy(1:10)
t + 1
# [1] 6.5

您还需要覆盖[,因为默认方法不会保留属性。

答案 1 :(得分:2)

正如@Ari所提到的,你可能需要这样做:

`+.toy` <- function(a, b) { 
     # you should check for class/mode/is.atomic here if necessary
     a$resA <- a$resA + b
     a
}

t <- toy(1:10)
t + 1
# [1] 6.5