blob: 862d7a1878b88955e4943fc4acc9b4116c667a1b [file] [log] [blame]
#' Convert xtable to a kable object
#'
#' @description This function allow users to turn an xtable object into a kable
#' so they can use most of kableExtra's functions with their xtable code without
#' making too many changes. Note that although I tested many cases and it seems
#' to work, this function may not be functional in some other cases. I'm not
#' a regular xtable user and can only provide very limited support for this
#' function.
#'
#' You should use this table in the same way as `print.xtable`. All the options
#' you provided to this function will be sent to `print.xtable`. Instead of
#' printing out the result, this function will return the LaTeX or HTML as
#' text and a kable object.
#'
#' @param x an xtable object
#' @param ... options for print.xtable
#'
#' @examples
#' \dontrun{
#' library(xtable)
#' xtable(mtcars) %>%
#' xtable2kable(booktabs = TRUE) %>%
#' kable_styling(latex_options = "striped")
#' }
#'
#' @export
xtable2kable <- function(x, ...) {
if (!class(x)[1] == "xtable") {
warning("x is not an xtable object.")
return(x)
}
out <- capture.output(print(x, ...))[-(1:2)]
out <- paste(out, collapse = "\n")
xtable_print_options <- list(...)
if ("type" %in% names(xtable_print_options) &&
xtable_print_options$type == "html") {
out <- structure(out, format = "html", class = "knitr_kable")
return(out)
}
out <- structure(out, format = "latex", class = "knitr_kable")
# Assign modefied meta to output
out_meta <- magic_mirror(out)
if ("table.placement" %in% names(xtable_print_options)) {
out_meta$valign <- paste0("[", xtable_print_options$table.placement, "]")
}
if ("tabular.environment" %in% names(xtable_print_options)) {
out_meta$tabular <- xtable_print_options$tabular.environment
}
attr(out, "kable_meta") <- out_meta
return(out)
}