考虑以下向量 x
x <- c(6e+06, 75000400, 743450000, 340000, 4300000)
Run Code Online (Sandbox Code Playgroud)
我希望打印x数百万,所以我写了一个打印方法并分配一个类x
print.million <- function(x, ...) {
x <- paste0(round(x / 1e6, 1), "M")
NextMethod(x, quote = FALSE, ...)
}
class(x) <- "million"
Run Code Online (Sandbox Code Playgroud)
所以现在x将打印我喜欢的方式,数值也保持不变.
x
# [1] 6M 75M 743.5M 0.3M 4.3M
unclass(x)
# [1] 6000000 75000400 743450000 340000 4300000
Run Code Online (Sandbox Code Playgroud)
这是我想要解决的问题.当我x进入数据框时,打印方法不再适用,并且x正常打印数值.
(df <- data.frame(x = I(x)))
# x
# 1 6e+06
# 2 75000400
# 3 743450000
# 4 340000
# 5 4300000
Run Code Online (Sandbox Code Playgroud)
该x列的类仍然是"百万"类,这绝对是我想要的.
df$x
# [1] 6M 75M 743.5M 0.3M 4.3M
class(df$x)
# [1] "AsIs" "million"
Run Code Online (Sandbox Code Playgroud)
如何放入x数据框并保持其打印方法?我已经尝试了所有的论据,data.frame()并且不知道下一步该转向何处.
所需的结果是下面的数据框,其中x仍为"百万"类,它保持其基础数值,并且还在数据框中打印,就像在控制台中打印的矢量一样.
# x
# 1 6M
# 2 75M
# 3 743.5M
# 4 0.3M
# 5 4.3M
Run Code Online (Sandbox Code Playgroud)
注意:这个问题与我之前发布的答案的第二部分有关.
你需要一个format方法和as.data.frame方法,如下所示:
x <- c(6e+06, 75000400, 743450000, 340000, 4300000)
class(x) <- 'million'
format.million <- function(x,...)paste0(round(unclass(x) / 1e6, 1), "M")
as.data.frame.million <- base:::as.data.frame.factor
data.frame(x)
Run Code Online (Sandbox Code Playgroud)