R中的运算符重载和类定义:使用不同的基本字段/语料库

时间:2011-11-05 20:16:49

标签: oop r math operator-overloading abstract-algebra

(我使用的是“field”in the mathematical sense; R已使用的基本字段/语料库包括实数和复数。)

我有兴趣允许其他一些基本字段/语料库(例如 F 5 ,这是基础5中的模运算)。要做到这一点,我需要

  1. 定义新数据类型
  2. 重载相关的运算符(+*,以及更多)
  3. 也许别的什么?例如,与其他功能集成?
  4. 那么,如何定义R中的新数据类型或重载运算符?

2 个答案:

答案 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
相关问题