更新创建打印自己的自定义S3方法:
的修复已经刚刚被合并在v1.10.5中。感谢Michael Chirico。
运行后:
install.packages('data.table', type = 'source',
repos = 'http://Rdatatable.github.io/data.table')
预期它将工作:
library(data.table)
# data.table 1.10.5 IN DEVELOPMENT built 2017-05-18 00:04:56 UTC; travis
# The fastest way to learn (by data.table authors): https://www.datacamp.com/courses/data-analysis-the-data-table-way
# Documentation: ?data.table, example(data.table) and browseVignettes("data.table")
# Release notes, videos and slides: http://r-datatable.com
print(data.table(1)[0])
# Empty data.table (0 rows) of 1 col: V1
data.table(1)[0]
# Empty data.table (0 rows) of 1 col: V1
这可能是因为data.table
的print
方法做了错误的事情。打印方法预计将无形地返回。但我怀疑data.table:::print.data.table
正在返回明显。
(更新:我刚刚提交a bug report to data.table不住他们,如果我已经分析了这个错误!)
从?print
:
“打印”打印它的参数和返回它无形(通过'不可见(x)')。
以下是对可能发生的一个微小的演示:
> x=list()
> class(x) <- 'X'
> print.X <- function(x) { print("I am printing"); return(1729); }
> x
[1] "I am printing"
> print(x)
[1] "I am printing"
[1] 1729
注意如何打字自身x
简单地打印文本,但没有编号。但是输入print(x)
也会导致打印号码。
然后,如果我安排这个印刷方法返回无形如下:
> print.X <- function(x) { print("I am printing"); return(invisible(1729)); }
..然后print(x)
给出了预期的输出
> print(x)
[1] "I am printing"
所以,当你在输入x
控制台,控制台确实以您的名义呼叫print
,并忽略来自print
(可能是可见的)。但如果输入print(x)
,则返回值print
将在打印出来时显示。
?print
文档有点误导我认为。 print
方法应该返回他们的说法,并认为如此无形中做是,但这些规则不执行
请报告这是在github上的错误。 – eddi
现在这样做@eddi。你的意思是用'data.table'作为打印方法的错误报告,是吗?许多答案(包括我自己的,我在进一步的实验后写的)表明'data.table'的'print'方法*应该*不可见地返回,但实际上它会显着返回。 –
是的,它应该不可见地返回 – eddi