diff --git a/utils.R b/utils.R new file mode 100644 index 0000000..94e8dce --- /dev/null +++ b/utils.R @@ -0,0 +1,66 @@ +library(knitr) +library(kableExtra) + +ellipse_table <- function(df, nr = 5, nc = 5, format = "latex") { + nrows <- nrow(df) + ncols <- ncol(df) + + # Ellipsis symbols depending on format + if (format == "latex") { + h_ellipsis <- "$\\dots$" # horizontal (for columns) + v_ellipsis <- "$\\vdots$" # vertical (for rows) + both_ellipsis <- "$\\ddots$" # for center cell (optional) + } else { + h_ellipsis <- "..." + v_ellipsis <- "..." + both_ellipsis <- "..." + } + + # Select top/bottom rows + row_idx <- c( + seq_len(ceiling(nr / 2)), + nrows - floor(nr / 2) + 1:nr - nr + ) + row_idx <- unique(pmax(pmin(row_idx, nrows), 1)) # clamp + + # Select left/right cols + col_idx <- c( + seq_len(ceiling(nc / 2)), + ncols - floor(nc / 2) + 1:nc - nc + ) + col_idx <- unique(pmax(pmin(col_idx, ncols), 1)) + + # Subset + sub_df <- df[row_idx, col_idx, drop = FALSE] + + # Insert ellipsis row if needed + if (nrows > nr) { + ellipsis_row <- as.list(rep(h_ellipsis, length(col_idx))) + sub_df <- rbind( + sub_df[1:ceiling(nr / 2), , drop = FALSE], + ellipsis_row, + sub_df[(ceiling(nr / 2) + 1):nrow(sub_df), , drop = FALSE] + ) + rownames(sub_df)[ceiling(nr / 2) + 1] <- v_ellipsis + } + + # Insert ellipsis col if needed + if (ncols > nc) { + ellipsis_col <- rep(v_ellipsis, nrow(sub_df)) + sub_df <- cbind( + sub_df[, 1:ceiling(nc / 2), drop = FALSE], + "..." = ellipsis_col, + sub_df[, (ceiling(nc / 2) + 1):ncol(sub_df), drop = FALSE] + ) + names(sub_df)[ceiling(nc / 2) + 1] <- h_ellipsis + } + + # # Optionally replace center cell with diagonal dots (nice touch in latex) + # if (format == "latex" && nrows > nr && ncols > nc) { + # mid_r <- ceiling(nrow(sub_df) / 2) + # mid_c <- ceiling(ncol(sub_df) / 2) + # sub_df[mid_r, mid_c] <- both_ellipsis + # } + # Print with kable + return(sub_df) +}