我想知道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)
}
我们可以为隐藏不必要信息的打印提供标准输出(在这种情况下为resB
和x
),用户只能看到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
调用会有效吗?
感谢您阅读本文。
答案 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