You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pillar更新后,自定义tbl子类传递参数至tbl_format_setup的规范方法

问题描述

我创建了一个tbl的子类,希望提供自定义print方法,通过添加更多参数进一步调整输出。已阅读vignette("extending", package = "pillar"),但在为print(或format)添加更多参数时遇到困难:

mt <- tibble::new_tibble(mtcars[1:3, ], my_attr = "set", class = "my_tibble")

tbl_format_setup.my_tibble <- function(x, ..., show_attr = TRUE) {
  setup <- NextMethod()
  if (show_attr) {
    setup$tbl_sum <- c(setup$tbl_sum, "Attribute" = attr(x, "my_attr"))
  }
  setup
}
mt
# # A tibble:  3 × 11
# # Attribute: set
#     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

目前这段代码能正常工作,但尝试向print传递show_attr = FALSE时会发出警告(不过能正确阻止额外行的打印):

print(mt, show_attr = FALSE)
# # A tibble: 3 × 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
# Warning message:
# `...` must be empty in `format.tbl()`
# Caused by error in `format_tbl()`:
# ! `...` must be empty.
# ✖ Problematic argument:
# • show_attr = FALSE 

pillar 1.10.0的破坏性变更导致旧版代码的实现方式失效,现在需要知道将额外参数传递至tbl_format_setup的规范方式。

解决方案

从pillar 1.10.0开始,format.tbl()和print.tbl()不再允许...中传递额外参数,正确的做法是自定义子类的print方法,通过setup_args参数将自定义参数传递给格式化流程:

mt <- tibble::new_tibble(mtcars[1:3, ], my_attr = "set", class = "my_tibble")

# 自定义print方法,显式声明参数并通过setup_args传递
print.my_tibble <- function(x, ..., show_attr = TRUE) {
  NextMethod("print", setup_args = list(show_attr = show_attr))
}

# 自定义tbl_format_setup方法接收参数
tbl_format_setup.my_tibble <- function(x, ..., show_attr = TRUE) {
  setup <- NextMethod()
  if (show_attr) {
    setup$tbl_sum <- c(setup$tbl_sum, "Attribute" = attr(x, "my_attr"))
  }
  setup
}

# 默认输出(显示属性)
mt

# 带参数输出(不显示属性,无警告)
print(mt, show_attr = FALSE)

原理说明

  • print.my_tibble显式定义show_attr参数,调用NextMethod时通过setup_args将参数打包传递给底层的pillar格式化逻辑,确保参数能被tbl_format_setup接收
  • tbl_format_setup.my_tibble中正常接收show_attr参数,保持原有的输出控制逻辑,同时避免了...参数非空的警告

内容的提问来源于stack exchange,提问作者thothal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 11:54:53