我有两个自定义类,它们具有不同类型的构造函数和不同类型的格式化方法,一个类依赖于对象的属性。
as.test_1 <- function(x, test_attribute, ...) {
attributes(x) <- list("test_attribute" = test_attribute)
x <-
structure(x, class = c("test_1", setdiff(class(x), "test_1")))
return(x)
}
format.test_1 <- function(x, ...) {
paste0(x, attributes(x)$test_attribute)
}
print.test_1 <- function(x, ...) {
cat(format(x, ...), "\n")
}
as.test_2 <- function(x, test_attribute, ...) {
x <-
structure(x, class = c("test_2", setdiff(class(x), "test_2")))
return(x)
}
format.test_2 <- function(x, ...) {
paste0(x, "test")
}
print.test_2 <- function(x, ...) {
cat(format(x, ...), "\n")
}
现在,我想绘制一些包含这些类的数据:
library(data.table)
data_1 <-
data.table(a = as.test_1(c(1, 2, 3, 4), test_attribute = "test"),
b = as.factor(c("a", "b", "c", "d")))
data_2 <-
data.table(a = as.test_2(c(1, 2, 3, 4), test_attribute = "test"),
b = as.factor(c("a", "b", "c", "d")))
我也想使用format方法来格式化y轴。这是我的第一次尝试,它适用于不依赖于格式化变量的属性的test_2类:
library(ggplot2)
plot_data <- function(data) {
g <- ggplot(data, aes(x = b, y = a))
g <- g + geom_bar(stat = "identity")
expand <- c(0, 0)
attributes(expand) <- attributes(data$a)
limits <- c(0, 4)
attributes(limits) <- attributes(data$a)
g <- g + scale_y_continuous(
expand = expand,
limits = limits,
oob = scales::squish,
labels = getS3method(f = "format", class = class(data$a)[[1]])
)
return(print(g))
}
但是对于test_1类,似乎在scale_y_continuous调用中某个位置丢失了属性。
plot_data(data_1)
plot_data(data_2)
有人知道如何解决此问题吗? 谢谢!