Hao Zhu | 2623412 | 2017-02-22 15:34:33 -0500 | [diff] [blame] | 1 | #' Add an extra header row above the current header |
| 2 | #' @export |
| 3 | htmlTable_add_header_above <- function(kable_input, header = NULL) { |
Hao Zhu | 981933b | 2017-02-22 18:46:23 -0500 | [diff] [blame^] | 4 | # if (is.null(header)) return(kable_input) |
Hao Zhu | 2623412 | 2017-02-22 15:34:33 -0500 | [diff] [blame] | 5 | kable_xml <- read_xml(as.character(kable_input), options = c("COMPACT")) |
Hao Zhu | 981933b | 2017-02-22 18:46:23 -0500 | [diff] [blame^] | 6 | # somehow xml2 cannot directly search by name here (it will result in a crash) |
| 7 | kable_xml_thead <- xml_child(kable_xml, 1) |
| 8 | if (xml_name(kable_xml_thead) != "thead") { |
| 9 | kable_xml_thead <- xml_child(kable_xml, 2) |
| 10 | } |
Hao Zhu | 2623412 | 2017-02-22 15:34:33 -0500 | [diff] [blame] | 11 | |
Hao Zhu | 981933b | 2017-02-22 18:46:23 -0500 | [diff] [blame^] | 12 | header <- standardize_header_input(header) |
Hao Zhu | 2623412 | 2017-02-22 15:34:33 -0500 | [diff] [blame] | 13 | |
Hao Zhu | 981933b | 2017-02-22 18:46:23 -0500 | [diff] [blame^] | 14 | header_rows <- xml_children(kable_xml_thead) |
| 15 | bottom_header_row <- header_rows[[length(header_rows)]] |
| 16 | kable_ncol <- length(xml_children(bottom_header_row)) |
| 17 | if (sum(header$colspan) != kable_ncol) { |
| 18 | stop("The new header row you provided has a different total number of ", |
| 19 | "columns with the original kable output.") |
| 20 | } |
Hao Zhu | 2623412 | 2017-02-22 15:34:33 -0500 | [diff] [blame] | 21 | |
Hao Zhu | 981933b | 2017-02-22 18:46:23 -0500 | [diff] [blame^] | 22 | new_header_row <- new_header_generator(header) |
| 23 | xml_add_child(kable_xml_thead, new_header_row, .where = 0) |
| 24 | return(structure(as.character(kable_xml), format = "html", |
| 25 | class = "knitr_kable")) |
| 26 | } |
Hao Zhu | 2623412 | 2017-02-22 15:34:33 -0500 | [diff] [blame] | 27 | |
Hao Zhu | 981933b | 2017-02-22 18:46:23 -0500 | [diff] [blame^] | 28 | standardize_header_input <- function(header) { |
| 29 | header_names <- names(header) |
| 30 | |
| 31 | if (is.null(header_names)) { |
| 32 | return(data.frame(header = header, colspan = 1, row.names = NULL)) |
| 33 | } |
| 34 | |
| 35 | names(header)[header_names == ""] <- header[header_names == ""] |
| 36 | header[header_names == ""] <- 1 |
| 37 | header_names <- names(header) |
| 38 | header <- as.numeric(header) |
| 39 | names(header) <- header_names |
| 40 | return(data.frame(header = names(header), colspan = header, row.names = NULL)) |
| 41 | } |
| 42 | |
| 43 | new_header_generator <- function(header_vector) { |
| 44 | header_items <- apply(header_vector, 1, function(x) { |
| 45 | paste0('<th style="text-align:center;" colspan="', x[2], '">', |
| 46 | x[1], '</th>') |
| 47 | }) |
| 48 | header_text <- paste(c("<tr>", header_items, "</tr>"), collapse = "") |
| 49 | header_xml <- read_xml(header_text, options = c("COMPACT")) |
| 50 | return(header_xml) |
Hao Zhu | 2623412 | 2017-02-22 15:34:33 -0500 | [diff] [blame] | 51 | } |