#' Print
#'
#' Print method for `cttab`
#'
#' @param x Table generated by \code{cttab}.
#' @param indent Indent string, default is two space.
#' @param ... Not used.
#'
#' @export
print.cttab <- function(x, indent = " ", ...){
# Extract the span positions
rowclass <- attr(x, "position")
# Extract align
if(is.null(attr(x, "align")))
align <- rep("l", ncol(x))
if(inherits(x, "matrix")){
align <- c("l", rep("c", ncol(x))) # Row names left align
# Row names to column
col.names <- colnames(x)
x <- cbind(' ' = rownames(x), x)
colnames(x) <- c("", col.names)
}
# Add indents
x[rowclass == 3, 1] <- paste0(indent, x[rowclass == 3, 1])
# Calculate the widths of the column with colnames excluding the span rows
l_h <- nchar(colnames(x), type = 'width')
l <- vapply(as.data.frame(x[!rowclass %in% c(0, 2), ]),
function(z) max(c(nchar(z, type = 'width'), 0), na.rm = TRUE), numeric(1))
l <- apply(rbind(l_h, l), 2, max)
# If span row larger than all combined, expand width
l_row <- vapply(as.data.frame(x[rowclass %in% c(0, 2), ]),
function(z) max(c(nchar(z, type = 'width'), 0), na.rm = TRUE), numeric(1))
if(l_row[1] > sum(l)){
add_l <- ceiling((l_row[1] - sum(l))/length(l))
l <- l + add_l
}
# Create heading
th <- mapply(FUN = pad_width, x = colnames(x), width = l, align = rep("c", ncol(x)))
th <- paste(th, collapse = "\u2502")
th <- sprintf('|%s|', th)
# Create borders
th0 <- paste(strrep("\u2500", l), collapse = "\u252c")
th1 <- paste(strrep("\u2500", l), collapse = "\u2534")
tb_tp <- paste0("\u250c", th0, "\u2510")
tb_lmd <- paste0("\u251c", th0, "\u2524")
tb_bt <- paste0("\u2514", th1, "\u2518")
tb_umd <- paste0("\u251c", th1, "\u2524")
# Tabel body
tb <- rep("", nrow(x))
for(i in seq_len(nrow(x))){
if(rowclass[i] %in% c(0, 2)){
tb[i] <- pad_width(x[i, 1], sum(l) + ncol(x) - 1, "l")
}else{
tb[i] <- paste(pad_width(x[i, ], l, align), collapse = "\u2502")
}
}
tb <- sprintf('|%s|', tb)
tb <- unname(split(tb, cumsum(seq_along(tb) %in% which(rowclass %in% c(0, 2)))))
tb <- lapply(tb, function(x)c(x, tb_umd))
tb <- lapply(tb, function(x)c(x[1], tb_lmd, x[2:length(x)]))
tb <- unlist(tb)
tb[length(tb)] <- tb_bt
tab <- c(tb_tp, th, tb_umd, tb)
cat(tab, sep = '\n')
}
# pad a character vector to width
#' @keywords internal
pad_width <- function(x, width, align) {
side <- c(l = 'right', c = 'both', r = 'left')[align]
w <- width - nchar(x, 'width')
w1 <- floor(w / 2)
s1 <- strrep(" ", w * (side == 'left') + w1 * (side == 'both'))
s2 <- strrep(" ", w * (side == 'right') + (w - w1) * (side == 'both'))
paste0(s1, x, s2)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.