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

时间:2016-09-22 15:22:04

标签: r data.table

在R控制台上,我预计print(x)将始终提供与x相同的输出。我一直认为控制台使用print来实际打印所有内容。但是print

还有一个额外的NULL
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?

此示例数据由data.table包创建,但我认为即使不使用data.table,一般问题仍然适用:在控制台上使用什么函数/方法打印返回值?< / p>

# R --vanilla  # R version 3.2.3

3 个答案:

答案 0 :(得分:8)

更新:

修复程序刚刚在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

可能是因为print的{​​{1}}方法做错了。打印方法应返回隐形。但我怀疑data.table正在明显地返回

(更新:我刚刚提交了a bug report to data.table。如果我对此进行了错误分析,请向他们道歉!)

来自data.table:::print.data.table

  

'print'打印其参数并以隐形方式返回(通过'invisible(x)')。

以下是可能发生的一个小小的演示:

?print

注意如何单独输入> 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方法假设返回他们的参数并且假定无形地这样做,但这些规则没有强制执行

答案 1 :(得分:3)

这可能是由于打印的返回值。

来自?print

  

'print'打印其参数并将其返回隐形(通过'invisible(x)')。

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

答案 2 :(得分:0)

调用的print方法取决于对象的类。因此,有一个print.table,print.data.frame,print.factor等,每个都有一个不同的函数来决定打印的内容。

试试这个

x<-NULL
print.data.frame(x)
print.table(x)

查看功能

print.data.frame
print.table

您将看到返回的内容会有所不同,具体取决于调用哪种S3打印方法,并且打印方式有很多种。

您正在调用的确切打印取决于data.table对象的类。

这也意味着您可以通过为对象分配自定义类并创建自定义打印功能来创建自己的自定义S3方法进行打印

class(object)<-"customclass"

print.customclass<-function(object,...){
   body of function
}

print(object)