我已经定义了一种使用类测试打印向量的方法:
print.test <- function(x, ...) {
x <- formatC(
as.numeric(x),
format = "f",
big.mark = ".",
decimal.mark = ",",
digits = 1
)
x[x == "NA"] <- "-"
x[x == "NaN"] <- "-"
print.default(x)
}
适用于以下情况
a <- c(1000.11, 2000.22, 3000.33)
class(a) <- c("test", class(a))
print(a)
[1] "1.000,11" "2.000,22" "3.000,33"
这也适用于:
round(a)
[1] "1.000,0" "2.000,0" "3.000,0"
这不会:
median(a)
[1] 2000.22
class(median(a))
[1] "numeric"
现在我的问题是:我是否需要为这个类编写一个自定义方法来使用中位数,例如,如果是这样,它会是什么样子,或者有其他方法(因为我只是希望这个类以某种格式打印数据(?
问题是median.default
返回类numeric
的对象,因此自动打印返回的对象不会调用自定义print
方法。
以下将执行此操作。
median.test <- function(x, na.rm = FALSE, ...){
y <- NextMethod(x, na.rm = na.rm, ...)
class(y) <- c("test", class(y))
y
}
median(a)
#[1] "2.000,2"
至于NA
值的处理,我将首先为基 R 函数定义另一种方法。它不是严格需要的,但如果经常使用类test
的对象,则保存一些代码行。
c.test <- function(x, ...){
y <- NextMethod(x, ...)
class(y) <- c("test", class(y))
y
}
b <- c(a, NA)
class(b)
#[1] "test" "numeric"
median(b)
#[1] "-"
median(b, na.rm = TRUE)
#[1] "2.000,2"
编辑。
下面定义了一个泛型函数wMedian
,一个默认方法和一个类"currency"
对象的方法,根据OP在注释中的请求。
请注意,必须有一个方法print.currency
,我不会重新定义,因为它与上面的print.test
完全相同。 至于其他方法,我在新功能的帮助下使它们更简单,as.currency
.
median.currency <- function(x, na.rm = FALSE, ...){
y <- NextMethod(x, na.rm = na.rm, ...)
as.currency(y)
}
c.currency <- function(x, ...){
y <- NextMethod(x, ...)
as.currency(y)
}
as.currency <- function(x){
class(x) <- c("currency", class(x))
x
}
wMedian <- function(x, ...) UseMethod("wMedian")
wMedian.default <- function(x, ...){
matrixStats::weightedMedian(x, ...)
}
wMedian.currency <- function(x, w = NULL, idxs = NULL, na.rm = FALSE, interpolate = is.null(ties), ties = NULL, ...) {
y <- NextMethod(x, w = w, idxs = idxs, na.rm = na.rm, interpolate = interpolate, ties = ties, ... )
as.currency(y)
}
set.seed(1)
x <- rnorm(10)
wMedian(x, w = (1:10)/10)
#[1] 0.4084684
wMedian(as.currency(x), w = (1:10)/10)
#[1] "0,4"