带有用户类的Print方法

带有用户类的Print方法,r,data.table,r-s3,R,Data.table,R S3,我正在试验S3类方法和泛型函数,但我有一个问题,我认为这突出了我思维中的一个误解。也许我对打印是如何工作的,或者存储值和属性是如何在内部工作的感到困惑 我试着用谷歌到处搜索,但没有结果,可能是因为我不太确定自己在找什么 安装程序 我想用某种方法只打印0.3333333 非常感谢您的帮助。谢谢 (作为旁注,我确信eval(parse(…)语句不是正确的方法。如果有任何指针,我也会很感激。) 我也不知道该怎么称呼它——如果有人有任何更合适的建议,我很乐意改变它。这里有两个更好的可能性,第一个是遵循您

我正在试验S3类方法和泛型函数,但我有一个问题,我认为这突出了我思维中的一个误解。也许我对打印是如何工作的,或者存储
值和
属性是如何在内部工作的感到困惑

我试着用谷歌到处搜索,但没有结果,可能是因为我不太确定自己在找什么

安装程序 我想用某种方法只打印
0.3333333

非常感谢您的帮助。谢谢

(作为旁注,我确信
eval(parse(…)
语句不是正确的方法。如果有任何指针,我也会很感激。)


我也不知道该怎么称呼它——如果有人有任何更合适的建议,我很乐意改变它。

这里有两个更好的可能性,第一个是遵循您的方法(由于自动索引,可能会更快,但我还没有进行基准测试):


但是,我不理解您对
打印方法的评论。
print
方法与乘法没有任何联系。

我从来没有想到
c
会是答案。。非常感谢罗兰。在最后一条评论中,我意识到打印/乘法位不清楚,但由于它似乎不太重要,所以留下了它。。最初,当我尝试这一点时,我也将准确的数字作为属性,并使用打印显示属性-但在这种情况下,我无法以预期的方式编辑它。我在原始问题中犯了一个错误,并编写了
CJ(字母->c(“a”,“B”,“c”),数字->1:4)
这导致
字母
存在于全局范围内,这意味着
dt[(子集),.N]/dt[,.N]
行起作用。如果在全局范围内没有
字母
,则会出现错误“
未找到字母
”。在纠正了我最初的错误后,是否还有这样的工作方式?
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
[1] 0.3333333
attr(,"class")
[1] "coverage" "numeric" 
attr(,"desc")
[1] "of data.table is in B"
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")
# 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"