1
4

2 に答える 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クラスの作業をたくさん行っています。5つの要素、またはおそらくリングを持つグループでグループ操作を開発したいと思いました。次に、単位元== 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)
}

2つの演算子が必要な場合は、次のものを探している可能性があります。

 `+.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 に答える