在将:=
扩展到新类并编写自定义打印方法后,如何禁止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"
,也许我可以聪明一点并覆盖给定的:=
选项?
答案 0 :(得分:3)
要停止打印,您可以执行invisible(dt_extend[, val2 := val])
您可以查看https://github.com/Rdatatable/data.table/issues/1122