メソッドとジェネリック関数を試していS3-class
ますが、私の考えの誤解を強調していると思われる問題が発生しています。おそらく、印刷がどのように機能するか、または内部でどのように保存values
および機能するかについて混乱していますか?attributes
おそらく、探しているものがよくわからないために、グーグルで検索しようとしましたが、うまくいきませんでした。
設定
library(data.table)
# trivial data
dt <- CJ(letter = c("A", "B", "C"), number = 1:4)
# -- generic functions
coverage <- function (x, ...) {
UseMethod("coverage", x)
}
prettyprint <- function (x, ...) {
UseMethod("prettyprint", x)
}
クラス メソッド
# coverage method to find % of data.table satisfying an expr
coverage.data.table <- function(dt, subset, desc) {
e <- parse(text = subset) # parse condition to expression
coverage <- dt[eval(e), .N]/dt[, .N] # express coverage as a percent
class(coverage) <- c("coverage", class(coverage)) # set as 'coverage' class
attributes(coverage)[["desc"]] <- desc # carry description for printing
coverage
}
# human readable data.table coverage
prettyprint.coverage <- function(coverage) {
desc <- attributes(coverage)[["desc"]]
paste0(round(coverage*100, 2), "% ", desc)
}
# normal printing
print.coverage <- function(coverage) {
# unsure what to put in here such that I can use
# this value with standard other operations such
# as multiplication
}
coverageB <- coverage(dt, "letter == \"B\"", "of data.table is in B")
> coverageB # prints nothing as expected from empty function
> prettyprint(coverageB)
[1] "33.33% of data.table is in B"
coverageB
ロードせずにprint.coverage
印刷する と
> coverageB
[1] 0.3333333
attr(,"class")
[1] "coverage" "numeric"
attr(,"desc")
[1] "of data.table is in B"
だけを印刷する方法が欲しいところ0.3333333
です。
助けていただければ幸いです。ありがとう。
(補足として、そのeval(parse(...))
ステートメントは物事を行う正しい方法ではないと確信しています。そこにあるポインタも高く評価されます。)
また、これにタイトルを付けるべきかどうかもわかりませんでした-誰かがより適切な提案を持っている場合は、喜んで変更します.