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

时间:2015-12-14 15:01:17

标签: r data.table

有时候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。

1 个答案:

答案 0 :(得分:4)

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

  

if (TRUE) DT[,LHS:=RHS]不再打印,#869和#1122。测试补充说。   为了实现这一点,我们不得不忍受一个缺点:如果是:=   在函数结束前没有DT[]的函数内部使用,   然后在提示符下次输入DTprint(DT)时,没有   将被打印。将打印重复的DTprint(DT)。为了避免这种情况   在您的函数中的最后DT[]之后添加:=。如果不是这样的话   可能(例如,它不是你可以改变的功能),然后是DT[]   保证提示打印。

<-是一个功能。当然,你根本不应该使用<-。它创建了一个不必要的副本(因为:=修改了data.table列),因此效率很低。