質問する
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クラスの作業をたくさん行っています。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 に答える