何时以及为什么需要两次尝试才能打印"data.table"?

7
有时候使用 print 命令打印 data.table 时需要尝试两次才能成功:
> library(data.table)
> 
> rm(list=ls())
> 
> Tbl <- fread( input = "Nr; Value
+                        Nr 1;46.73
+                        Nr 2;49.02
+                        Nr 3;50.62
+                        Nr 4;49.80
+                        Nr 5;50.15",
+               sep    = ";",
+               header = TRUE,
+               colClasses = c("character","numeric") )
> print(Tbl)
     Nr Value
1: Nr 1 46.73
2: Nr 2 49.02
3: Nr 3 50.62
4: Nr 4 49.80
5: Nr 5 50.15
> Tbl <- Tbl[, Nr := as.numeric( gsub( "Nr ", "", Tbl$Nr ))]
> print(Tbl)
> print(Tbl)
   Nr Value
1:  1 46.73
2:  2 49.02
3:  3 50.62
4:  4 49.80
5:  5 50.15
> 

不是data.frame类型的数据:

> rm(list=ls())
> 
> DF <- read.table( text = "Nr; Value
+                           Nr 1;46.73
+                           Nr 2;49.02
+                           Nr 3;50.62
+                           Nr 4;49.80
+                           Nr 5;50.15",
+                   sep    = ";",
+                   header = TRUE,
+                   colClasses = c("character","numeric"))
> 
> DF$Nr <- as.numeric( gsub( "Nr ", "", DF$Nr ))
> print(DF)
  Nr Value
1  1 46.73
2  2 49.02
3  3 50.62
4  4 49.80
5  5 50.15
> 

如果代码包含在脚本文件中,data.table 会立即打印出来。
> source(path_to_Script_1,echo=TRUE,prompt.echo="(script)   ",max.deparse.length=500)

(script)   library(data.table)

(script)   rm(list=ls())

(script)   Tbl <- fread( input = "Nr; Value
+                        Nr 1;46.73
+                        Nr 2;49.02
+                        Nr 3;50.62
+                        Nr 4;49.80
+                        Nr 5;50.15",
+               sep    = ";",
+               header = TRUE,
+               colClasses = c("character","numeric") )

(script)   Tbl <- Tbl[, Nr := as.numeric( gsub( "Nr ", "", Tbl$Nr ))]

(script)   print(Tbl)
   Nr Value
1:  1 46.73
2:  2 49.02
3:  3 50.62
4:  4 49.80
5:  5 50.15
> 

但是如果脚本文件中省略了print(Tbl),则控制台上的print需要再次尝试两次:

> source(path_to_Script_2,echo=TRUE,prompt.echo="(script)   ",max.deparse.length=500)

(script)   library(data.table)

(script)   rm(list=ls())

(script)   Tbl <- fread( input = "Nr; Value
+                        Nr 1;46.73
+                        Nr 2;49.02
+                        Nr 3;50.62
+                        Nr 4;49.80
+                        Nr 5;50.15",
+               sep    = ";",
+               header = TRUE,
+               colClasses = c("character","numeric") )

(script)   Tbl <- Tbl[, Nr := as.numeric( gsub( "Nr ", "", Tbl$Nr ))]
> print(Tbl)
> print(Tbl)
   Nr Value
1:  1 46.73
2:  2 49.02
3:  3 50.62
4:  4 49.80
5:  5 50.15
> 

有人能告诉我为什么print需要尝试两次吗? 我正在使用R版本3.2.2:
> R.version
               _                           
platform       x86_64-w64-mingw32          
arch           x86_64                      
os             mingw32                     
system         x86_64, mingw32             
status                                     
major          3                           
minor          2.2                         
year           2015                        
month          08                          
day            14                          
svn rev        69053                       
language       R                           
version.string R version 3.2.2 (2015-08-14)
nickname       Fire Safety   

操作系统是Windows 7。


6
请注意删除所有的“+”和“>”,以便尝试回答您问题的人可以轻松运行代码。 - Matthew Plourde
3
可能相关:当从函数返回数据表对象时,数据表对象没有被打印出来。 - Cath
如果print(Tbl)包含在脚本文件中和不包含有什么区别? - mra68
4
为什么要在引用赋值时使用 Tbl <-?这是一个无用的复制。可以直接使用 Tbl[, Nr := as.numeric( gsub( "Nr ", "", Tbl$Nr ))],该语句会直接修改数据表中的内容。 - Roland
长话短说,如果您想确保它会打印,请添加 [ ] - MichaelChirico
3
同时,最好不要在代码中放置 rm(list = ls()),以免有人复制粘贴并运行而没有仔细阅读。如果您需要删除特定对象以使示例正常工作,请具体说明 rm(Tbl) - Gregor Thomas
1个回答

4
引用NEWS(版本1.9.6中的错误修复):

if (TRUE) DT[,LHS:=RHS]不再打印,#869和#1122。添加了测试。 为了使其工作,我们必须忍受一个缺点:如果在函数内部使用:=,并且在函数结束之前没有DT[],那么下一次在提示符处键入DTprint(DT)时,将不会打印任何内容。重复输入DTprint(DT)将会打印。为了避免这种情况:在函数中的最后一个:=之后包含一个DT[]。如果不可能(例如,您无法更改函数),则在提示符处键入DT[]将保证打印。

<-是一个函数。当然,在那里你不应该使用<-。它会创建一个不必要的副本(因为:=直接修改数据表列),因此效率低下。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接