1

メソッドとジェネリック関数を試してい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(...))ステートメントは物事を行う正しい方法ではないと確信しています。そこにあるポインタも高く評価されます。)

また、これにタイトルを付けるべきかどうかもわかりませんでした-誰かがより適切な提案を持っている場合は、喜んで変更します.

4

1 に答える 1

1

ここに2つのより良い可能性があります.1つ目はあなたのアプローチに従います(自動インデックス作成により高速になる可能性がありますが、ベンチマークは行っていません):

coverage.data.table <- function(dt, subset, desc) {
  coverage <- dt[eval(substitute(subset)), .N]/dt[, .N]  # express coverage as a percent 
  #coverage <- dt[, mean(eval(substitute(subset)))]  # express coverage as a percent 
  class(coverage) <- c("coverage", class(coverage))  # set as 'coverage' class
  attributes(coverage)[["desc"]] <- desc  # carry description for printing
  coverage
}

次に、次のように呼び出します。

coverageB <- coverage(dt, letter == "B", "of data.table is in B")

すべての属性を削除するためprintに使用するメソッドを次に示します (ドキュメントを参照してください)。c

# normal printing
print.coverage <- function(coverage) {
  print.default(c(coverage))
} 

coverageB
#[1] 0.3333333
prettyprint(coverageB)
#[1] "33.33% of data.table is in B"

ただし、print方法に関するコメントは理解できません。このprint方法は、乗算とはまったく関係がありません。

于 2015-11-15T14:21:11.260 に答える