问问题
3271 次
2 回答
9
我发现 Hadley Wickham 的devtools wiki是开始使用 R 中的类的宝贵资源。特别是,请阅读以下部分:
这是一个说明类中一些概念的起点S3
。让我们给你的新班级打电话吧f5
。至少,您可能希望为以下内容创建方法:
- 强迫:
as.f5
- 测试:
is.f5
- 一些基本运算符:
+.f5
- 处理打印的类:
print.f5
一些代码(digitsBase
在包GLDEX
中使用进行基本转换):
library(GLDEX)
as.f5 <- function(x){
if(!inherits(x, "f5")) class(x) <- c("f5", class(x))
x
}
is.f5 <- function(x){
inherits(x, "f5")
}
`+.f5` <- function(e1, e2){
NextMethod(e1, e2)
}
print.f5 <- function(x, ...){
# Next line from ?GLDEX::digitsBase
b2ch <- function(db) noquote(gsub("^0+(.{1,})$"," \1",
apply(db, 2, paste, collapse = "")))
cat("Base 5:\n")
cat(b2ch(digitsBase(x, 5)))
invisible(x)
}
x <- as.f5(0:10)
y <- as.f5(5)
x + y
Base 5:
10 11 12 13 14 20 21 22 23 24 30
于 2011-11-06T08:35:40.263 回答
4
我对您的问题的解释与@Andrie 略有不同,但他已经完成了许多必要的 S3 课程工作。我以为你想在一个有五个元素的组上开发组操作,或者可能是一个环。然后,您需要一个带有标识元素 == 0 的“+”操作,并且可能需要一个带有标识元素 == 1 的“*”操作。
如果您希望将非负整数映射到此,您将使用模算术运算符,%%
也许%/%
:
?Ops
as.g5 <- function(x){
if(!inherits(x, "g5")) class(x) <- c("g5", class(x))
x %% 5
}
print.g5 <- function(x, ...){
cat("G5 equivalent:\n")
cat(x %% 5)
invisible(x)
}
如果您想要两个运算符,您可能正在寻找:
`+.g5` <- function(e1, e2){
NextMethod(e1 ,e2) %% 5
}
`*.g5` <- function(e1, e2){
NextMethod(e1 ,e2) %% 5
}
x <- as.g5(0:10)
y <- as.g5(5)
x + y
#G5 equivalent:
#0 1 2 3 4 0 1 2 3 4 0
y <- as.g5(2)
x * y
#G5 equivalent:
#0 2 4 1 3 0 2 4 1 3 0
也可以在“易失”版本的向量上使用这些操作:
as.g5(1:10) * as.g5(1:10)
# G5 equivalent:
# 1 4 4 1 0 1 4 4 1 0
于 2011-11-07T13:48:27.377 回答