blob: b91a38c2549bb9f7b583ae6450b583ba097dd61b [file] [log] [blame]
#' Add a header column
#'
#' @description Experimenting. Please don't use it in production
#'
#' @export
add_header_left <- function(kable_input, header = NULL, header_name = "") {
if (is.null(header)) return(kable_input)
kable_format <- attr(kable_input, "format")
if (!kable_format %in% c("html", "latex")) {
stop("Please specify output format in your kable function. Currently ",
"generic markdown table using pandoc is not supported.")
}
if (kable_format == "html") {
return(add_header_left_html(kable_input, header, header_name))
}
if (kable_format == "latex") {
return(add_header_left_latex(kable_input, header, header_name))
}
}
# HTML
add_header_left_html <- function(kable_input, header, header_name) {
kable_attrs <- attributes(kable_input)
kable_xml <- read_xml(as.character(kable_input), options = "COMPACT")
kable_thead <- xml_tpart(kable_xml, "thead")
kable_tbody <- xml_tpart(kable_xml, "tbody")
new_header <- paste0(
'<th style="text-align:center;" rowspan="',
length(xml_children(kable_thead)), '">', header_name, '</th>'
)
new_header <- read_xml(new_header, options = c("COMPACT"))
xml_add_child(xml_child(kable_thead, 1), new_header, .where = 0)
header <- standardize_rowheader_input(header, length(xml_children(kable_tbody)))
for (i in 1:nrow(header)) {
new_row_item <- paste0(
'<td style="text-align:center; vertical-align: middle;" rowspan="',
header$rowspan[i], '">', header$header[i], '</td>')
new_row_item <- read_xml(new_row_item, options = "COMPACT")
target_row <- xml_child(kable_tbody, header$row[i])
xml_add_child(target_row, new_row_item, .where = 0)
}
out <- structure(as.character(kable_xml), format = "html",
class = "knitr_kable")
attributes(out) <- kable_attrs
return(out)
}
standardize_rowheader_input <- function(header, n_row) {
header_names <- names(header)
if (is.null(header_names)) {
return(data.frame(header = header, row = 1:length(header),
rowspan = 1, row.names = NULL))
}
names(header)[header_names == ""] <- header[header_names == ""]
header[header_names == ""] <- 1
header_names <- names(header)
header <- as.numeric(header)
names(header) <- header_names
if (sum(header) < n_row) {
header <- c(header, " " = n_row - sum(header))
}
row_pos <- c(1, cumsum(header)[-length(header)] + 1)
return(data.frame(
header = names(header),
row = row_pos, rowspan = header, row.names = NULL
))
}
add_header_left_latex <- function(kable_input, header, header_name) {
return(kable_input)
}