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
相关产品推荐
相关产品推荐

