使用自定义打印方法

时间:2017-06-29 07:56:29

标签: r data.table

问题

在将:=扩展到新类并编写自定义打印方法后,如何禁止data.table打印到控制台?

实施例

在此示例中,我通过向班级添加data.table来扩展extended.data.table

我还要为我要以特定格式打印的其中一列添加属性。

library(data.table)
## create data.table
dt_extend <- data.table(id = 1:5,
                        val = letters[1:5])

## create two attributes:
## - extend.data.table  onto data.table
## - extended           onto the 'val' column
setattr(dt_extend, 'class', c('extended.data.table', class(dt_extend)))
setattr(dt_extend[['val']], 'extended', 'print')

## Method to format the 'extended' column when printed
print.extended.data.table <- function(edt){

    ## find the 'extended' column
    cols <- sapply(edt, function(x) names(attributes(x)))
    cols <- names(which(cols == "extended"))

    ## more than one column can have the 'extended' attribute
    edt <- edt[,  
            lapply(.SD, function(y) { paste0("formatted: ", y) } ), 
            by = setdiff(names(edt), cols), 
            .SDcols = cols
            ]

    ## now call data.table print
    NextMethod()
}

## these all print as expected
dt_extend
dt_extend[1, .(val)]

str(dt_extend)
# Classes ‘extended.data.table’, ‘data.table’ and 'data.frame': 5 obs. of  2 variables:
#   $ id : int  1 2 3 4 5
# $ val: atomic  a b c d ...
# ..- attr(*, "extended")= chr "print"
# - attr(*, ".internal.selfref")=<externalptr>

使用:=更新按引用正确更新列,但它也会打印到控制台。

为什么会发生这种情况,和/或如何停止打印?

## why does this update AND print?
dt_extend[, val2 := val]

看起来这些都是相关的,以及我所描述的问题:

更新

print.data.table内有一行说

  

if (nrows <= 0L) return(invisible()) # ability to turn off printing

其中nrows在函数参数中定义为

nrows=getOption("datatable.print.nrows")

哪个是option,可以通过

设置
options("datatable.print.nrows" = -1L)

设置此选项确实会在使用:=时抑制打印。如果用户使用了"datatable.print.nrows",也许我可以聪明一点并覆盖给定的:=选项?

1 个答案:

答案 0 :(得分:3)

要停止打印,您可以执行invisible(dt_extend[, val2 := val]) 您可以查看https://github.com/Rdatatable/data.table/issues/1122