(我使用的是“field”in the mathematical sense; R
已使用的基本字段/语料库包括实数和复数。)
我有兴趣允许其他一些基本字段/语料库(例如 F 5 ,这是基础5中的模运算)。要做到这一点,我需要
+
,*
,以及更多)那么,如何定义R
中的新数据类型或重载运算符?
答案 0 :(得分: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
答案 1 :(得分: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