Мне часто приходится использовать многомерные комплексные числа в форме 1 + 1i + 1j + 1ij (чтобы привести один 2D-пример), и я пытаюсь определить простой класс для облегчения общих вычислений.
Имея дело с несколькими такими числами, я решил использовать представление списка векторов.Однако я все еще хочу, чтобы этот класс производного списка выглядел и чувствовал себя как вектор.
У меня не было проблем с простой печатью:
ncmplx <- setClass("ncmplx", contains = "list")
format.ncmplx <- function(x, ...) {
f <- function(y) {
paste(format(as.numeric(y), ...), c('', 'i', 'j', 'ij'),
sep = '', collapse = '+')
}
unlist(lapply(x, f))
}
setMethod("show", "ncmplx", function(object) {
print(format(object))
})
a <- ncmplx(list(1:4, 2:5))
Использование print(a)
отображает [1] "1+2i+3j+4ij" "2+3i+4j+5ij"
, чтов основном то, что я хотел бы.
Вопрос в том, как получить аналогичный дисплей в tibble
?Я следовал этому руководству: https://cran.r -project.org / web / packages / tibble / vignettes / extending.html , но он использует базовый вектор для всего, а не список, который, кажется, делает вещиПолегче.Вот что я попробовал:
library(tibble)
pillar_shaft.ncmplx <- function(x, ...) {
out <- format(x)
out[is.na(x)] <- NA
pillar::new_pillar_shaft_simple(out, align = "right")
}
a <- ncmplx(list(1:4, 2:5))
b <- tibble(x = 1:2, a = a)
print(b)
Но результат по-прежнему отображает сводку на основе списка в форме <int [4]>
, а не в формате, который мне нужен 1+2i+3j+4ij
.
Я могу взломать функцию obj_sum()
, чтобы сводка содержимого моего списка фактически представляла собой прямое представление содержимого списка, но это кажется окольным.Есть ли способ сказать tibble
просто отформатировать мой список, используя функцию format()
вместо obj_sum()
?