在R控制台,我预计print(x)它将始终提供相同的输出x.我一直认为print控制台使用它来实际打印所有内容.但是这里有一个额外的NULL print:
library(data.table)
print(data.table(1)[0])
# Empty data.table (0 rows) of 1 col: V1
# NULL # why is this 'NULL' printed here?
data.table(1)[0]
# Empty data.table (0 rows) of 1 col: V1
# .. but no 'NULL' here?
Run Code Online (Sandbox Code Playgroud)
这个示例数据是由data.table包创建的,但我认为一般问题即使在不使用时仍然适用data.table:在控制台上使用什么函数/方法来打印返回值?
# R --vanilla # R version 3.2.3
Run Code Online (Sandbox Code Playgroud)
更新:
修复程序刚刚在v1.10.5中合并.感谢Michael Chirico.
运行后:
install.packages('data.table', type = 'source',
repos = 'http://Rdatatable.github.io/data.table')
Run Code Online (Sandbox Code Playgroud)
它将按预期工作:
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
Run Code Online (Sandbox Code Playgroud)
这可能是因为print方法data.table做错了.打印方法有望无形地返回.但我怀疑data.table:::print.data.table是明显回归.
(更新:我刚刚向data.table提交了一个错误报告.如果我对此进行了错误分析,请向他们道歉!)
来自?print:
'print'打印其参数并以不可见的方式返回它(通过'invisible(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
Run Code Online (Sandbox Code Playgroud)
请注意,键入x它自己只是打印文本,但没有数字.但是输入print(x)也会导致打印数字.
然后,如果我安排这种打印方法无形地返回如下:
> print.X <- function(x) { print("I am printing"); return(invisible(1729)); }
Run Code Online (Sandbox Code Playgroud)
..然后print(x)给出预期的输出
> print(x)
[1] "I am printing"
Run Code Online (Sandbox Code Playgroud)
因此,当您x在控制台上键入时,控制台会print代表您调用并忽略返回值print(可能是可见的).但是如果你键入print(x),那么print如果可见,将打印返回值.
该?print文档是有点误导,我认为.print方法应该返回他们的参数,并且应该无形地这样做,但是这些规则不会被强制执行
这可能是由于 print 的返回值造成的。
\n\n从?print:
\n\n\n\xe2\x80\x98print\xe2\x80\x99 打印其参数并以不可见的方式返回它(通过 \xe2\x80\x98invisible(x)\xe2\x80\x99)。
\n
所以print有一个返回值,这恰好是NULL本例中的情况。另一方面,在控制台中键入变量会创建输出,但它不会返回任何内容,并且NULL不会显示。