blob: b91a38c2549bb9f7b583ae6450b583ba097dd61b [file] [log] [blame]
Hao Zhu96a50b52017-06-14 18:09:35 -04001#' Add a header column
2#'
3#' @description Experimenting. Please don't use it in production
4#'
5#' @export
6add_header_left <- function(kable_input, header = NULL, header_name = "") {
7 if (is.null(header)) return(kable_input)
8 kable_format <- attr(kable_input, "format")
9 if (!kable_format %in% c("html", "latex")) {
10 stop("Please specify output format in your kable function. Currently ",
11 "generic markdown table using pandoc is not supported.")
12 }
13 if (kable_format == "html") {
14 return(add_header_left_html(kable_input, header, header_name))
15 }
16 if (kable_format == "latex") {
17 return(add_header_left_latex(kable_input, header, header_name))
18 }
19}
20
21# HTML
22add_header_left_html <- function(kable_input, header, header_name) {
23 kable_attrs <- attributes(kable_input)
24 kable_xml <- read_xml(as.character(kable_input), options = "COMPACT")
25 kable_thead <- xml_tpart(kable_xml, "thead")
26 kable_tbody <- xml_tpart(kable_xml, "tbody")
27
28 new_header <- paste0(
29 '<th style="text-align:center;" rowspan="',
30 length(xml_children(kable_thead)), '">', header_name, '</th>'
31 )
32 new_header <- read_xml(new_header, options = c("COMPACT"))
33 xml_add_child(xml_child(kable_thead, 1), new_header, .where = 0)
34
35 header <- standardize_rowheader_input(header, length(xml_children(kable_tbody)))
36 for (i in 1:nrow(header)) {
37 new_row_item <- paste0(
38 '<td style="text-align:center; vertical-align: middle;" rowspan="',
39 header$rowspan[i], '">', header$header[i], '</td>')
40 new_row_item <- read_xml(new_row_item, options = "COMPACT")
41 target_row <- xml_child(kable_tbody, header$row[i])
42 xml_add_child(target_row, new_row_item, .where = 0)
43 }
44
45 out <- structure(as.character(kable_xml), format = "html",
46 class = "knitr_kable")
47 attributes(out) <- kable_attrs
48 return(out)
49}
50
51standardize_rowheader_input <- function(header, n_row) {
52 header_names <- names(header)
53
54 if (is.null(header_names)) {
55 return(data.frame(header = header, row = 1:length(header),
56 rowspan = 1, row.names = NULL))
57 }
58
59 names(header)[header_names == ""] <- header[header_names == ""]
60 header[header_names == ""] <- 1
61 header_names <- names(header)
62 header <- as.numeric(header)
63 names(header) <- header_names
64 if (sum(header) < n_row) {
65 header <- c(header, " " = n_row - sum(header))
66 }
67 row_pos <- c(1, cumsum(header)[-length(header)] + 1)
68 return(data.frame(
69 header = names(header),
70 row = row_pos, rowspan = header, row.names = NULL
71 ))
72}
73
74add_header_left_latex <- function(kable_input, header, header_name) {
75 return(kable_input)
76}