Sam Firke
Sam Firke

Reputation: 23004

How to print tibble without row.names / row numbers

Tibbles print with row numbers as row names. See 1, 2 in the left margin below:

tibble::as_tibble(mtcars)

# A tibble: 32 x 11
     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1  21       6  160    110  3.9   2.62  16.5     0     1     4     4
 2  21       6  160    110  3.9   2.88  17.0     0     1     4     4

Can I suppress those numbers from printing, in an argument to tibble:::print.tbl() or otherwise? I know I can use the row.names = FALSE argument in print.data.frame: print.data.frame(as_tibble(mtcars), row.names = FALSE) but then I don't get all the other nice printing options of it being a tibble, it just prints like a regular data.frame.

I'd like to keep the output the same as in print.tbl() - like what's above, here - but without row numbers.

Upvotes: 6

Views: 1619

Answers (2)

rawr
rawr

Reputation: 20811

You could capture the printed output and replace the row numbers with white space, and then hijack tibble:::print.tbl

tibble::as_tibble(mtcars)
# A tibble: 32 x 11
     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1  21       6  160    110  3.9   2.62  16.5     0     1     4     4
 2  21       6  160    110  3.9   2.88  17.0     0     1     4     4
 3  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1
 4  21.4     6  258    110  3.08  3.22  19.4     1     0     3     1
 5  18.7     8  360    175  3.15  3.44  17.0     0     0     3     2
 6  18.1     6  225    105  2.76  3.46  20.2     1     0     3     1
 7  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4
 8  24.4     4  147.    62  3.69  3.19  20       1     0     4     2
 9  22.8     4  141.    95  3.92  3.15  22.9     1     0     4     2
10  19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4
# … with 22 more rows

print.tbl <- function(x) {
  ## tibble:::print.tbl
  o <- capture.output(tibble::as_tibble(x))
  m <- gregexpr('^ *\\d+', o)
  regmatches(o, m) <- ' '
  cli::cat_line(o)
  invisible(x)
}

tibble::as_tibble(mtcars)
# A tibble: 32 x 11
     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
   21       6  160    110  3.9   2.62  16.5     0     1     4     4
   21       6  160    110  3.9   2.88  17.0     0     1     4     4
   22.8     4  108     93  3.85  2.32  18.6     1     1     4     1
   21.4     6  258    110  3.08  3.22  19.4     1     0     3     1
   18.7     8  360    175  3.15  3.44  17.0     0     0     3     2
   18.1     6  225    105  2.76  3.46  20.2     1     0     3     1
   14.3     8  360    245  3.21  3.57  15.8     0     0     3     4
   24.4     4  147.    62  3.69  3.19  20       1     0     4     2
   22.8     4  141.    95  3.92  3.15  22.9     1     0     4     2
   19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4
# … with 22 more rows

edit

Here is another attempt with a few more features. You can pass n, width, or n_extra to tibble:::print.tbl as usual:

x <- tibble::as_tibble(mtcars)
print(x, n = 3, width = 60, n_extra = 1)
# A tibble: 32 x 11
    mpg   cyl  disp    hp  drat    wt  qsec    vs    am
  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1  21       6   160   110  3.9   2.62  16.5     0     1
2  21       6   160   110  3.9   2.88  17.0     0     1
3  22.8     4   108    93  3.85  2.32  18.6     1     1
# … with 29 more rows, and 2 more variables: gear <dbl>, …

And you can also exclude the row names, dimensions, and variable class or any combination:

print(x, row.names = FALSE, dims = FALSE, classes = FALSE, n = 3)
    mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
   21       6   160   110  3.9   2.62  16.5     0     1     4     4
   21       6   160   110  3.9   2.88  17.0     0     1     4     4
   22.8     4   108    93  3.85  2.32  18.6     1     1     4     1
# … with 29 more rows

Here is the function although to get these extra features you must use print(x) where x is of class tbl instead of just x.

print.tbl <- function(x, ..., row.names = TRUE, classes = TRUE, dims = TRUE) {
  ## tibble:::print.tbl
  o <- capture.output(tibble:::print.tbl(tibble::as_tibble(x), ...))
  
  if (!row.names) {
    m <- gregexpr('^ *\\d+', o)
    regmatches(o, m) <- ' '
  }
  
  if (!classes)
    o <- o[!grepl('^ +<...>', o)]
  
  if (!dims)
    o <- o[!grepl('^# A tibble.*', o)]
  
  cli::cat_line(o)
  invisible(x)
}

Upvotes: 5

Ian Campbell
Ian Campbell

Reputation: 24770

The row names are applied by pillar::squeeze. You could create a copy of the squeeze function (source here) with the relevant section commented out:

squeeze <- function(x, width = NULL, ...) {
  zero_height <- length(x) == 0L || length(x[[1]]) == 0L
  if (zero_height) {
    return(new_colonnade_sqeezed(list(), colonnade = x, extra_cols = seq_along(x)))}
  if (is.null(width)) {width <- pillar:::get_width(x)}
  if (is.null(width)) {width <- getOption("width")}
  rowid <- pillar:::get_rowid_from_colonnade(x)
  if (is.null(rowid)) {
    rowid_width <- 0 } 
  else { rowid_width <- max(pillar:::get_widths(rowid)) + 1L }
  col_widths <- pillar:::colonnade_get_width(x, width, rowid_width)
  col_widths_show <- split(col_widths, factor(col_widths$tier != 0, levels = c(FALSE, TRUE)))
  col_widths_shown <- col_widths_show[["TRUE"]]
  col_widths_tiers <- split(col_widths_shown, col_widths_shown$tier)
  out <- map(col_widths_tiers, function(tier) {
    map2(tier$pillar, tier$width, pillar:::pillar_format_parts)
  })
  #if (!is.null(rowid)) {
  #  rowid_formatted <- pillar:::pillar_format_parts(rowid, rowid_width - 1L)
  #  out <- map(out, function(x) c(list(rowid_formatted), x))
  #}
  extra_cols <- rlang:::seq2(nrow(col_widths_shown) + 1L, length(x))
  pillar:::new_colonnade_sqeezed(out, colonnade = x, extra_cols = extra_cols)
}

Then assign the new version into the pillar namespace, and you are set.

library(tidyverse)
assignInNamespace("squeeze", squeeze, ns = "pillar")
as_tibble(mtcars)
# A tibble: 32 x 11
  mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 21       6  160    110  3.9   2.62  16.5     0     1     4     4
 21       6  160    110  3.9   2.88  17.0     0     1     4     4
 22.8     4  108     93  3.85  2.32  18.6     1     1     4     1
 21.4     6  258    110  3.08  3.22  19.4     1     0     3     1
 18.7     8  360    175  3.15  3.44  17.0     0     0     3     2
 18.1     6  225    105  2.76  3.46  20.2     1     0     3     1
 14.3     8  360    245  3.21  3.57  15.8     0     0     3     4
 24.4     4  147.    62  3.69  3.19  20       1     0     4     2
 22.8     4  141.    95  3.92  3.15  22.9     1     0     4     2
 19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4
# … with 22 more rows

Upvotes: 2

Related Questions