【问题标题】:How to print tibble without row.names / row numbers如何在没有 row.names / 行号的情况下打印 tibble
【发布时间】:2020-12-26 20:26:39
【问题描述】:

Tibbles 以行号作为行名打印。请参阅下方左边距中的1, 2

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

我可以在tibble:::print.tbl() 的参数中或以其他方式禁止打印这些数字吗?我知道我可以在print.data.frame:print.data.frame(as_tibble(mtcars), row.names = FALSE) 中使用row.names = FALSE 参数,但是我没有得到它作为小标题的所有其他不错的打印选项,它只是像普通的data.frame 一样打印。

我想保持与print.tbl() 中的输出相同 - 就像上面的一样,这里 - 但没有行号。

【问题讨论】:

  • 如果您查看tibble:::print.tbl,它会跟踪tibble:::format.tbltibble:::trunc_mattibble:::shrink_mat,但似乎没有一种明显的方式可以引用此类选项/介绍了。您可以编写一个包装函数来捕获输出并对其进行修改,但这似乎有点脆弱。

标签: r tibble


【解决方案1】:

行名称由pillar::squeeze 应用。您可以创建 squeeze 函数 (source here) 的副本,并将相关部分注释掉:

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)
}

然后将新版本分配到pillar 命名空间中,然后就设置好了。

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

【讨论】:

    【解决方案2】:

    您可以捕获打印输出并将行号替换为空格,然后劫持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
    

    编辑

    这是另一种尝试,增加了一些功能。您可以照常将nwidthn_extra 传递给tibble:::print.tbl

    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>, …
    

    您还可以排除行名、维度和变量类或任意组合:

    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
    

    这里是函数,但要获得这些额外功能,您必须使用 print(x),其中 x 属于 tbl 类,而不仅仅是 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)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-16
      • 1970-01-01
      • 2010-10-04
      相关资源
      最近更新 更多