`print(x)`没有给出与`x`相同的输出

Aar*_*aid 6 r data.table

在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)

Aar*_*aid 8

更新:

修复程序刚刚在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方法应该返回他们的参数,并且应该无形地这样做,但是这些规则不会被强制执行


RHe*_*tel 3

这可能是由于 print 的返回值造成的。

\n\n

?print

\n\n
\n

\xe2\x80\x98print\xe2\x80\x99 打印其参数并以不可见的方式返回它(通过 \xe2\x80\x98invisible(x)\xe2\x80\x99)。

\n
\n\n

所以print有一个返回值,这恰好是NULL本例中的情况。另一方面,在控制台中键入变量会创建输出,但它不会返回任何内容,并且NULL不会显示。

\n