2015-12-14 5 views
7

volte print ha bisogno di due tentativi di stampare un data.table:Quando e perché la "stampa" ha bisogno di due tentativi per stampare un "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 
> 

Non così un 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 
> 

Se il codice è contenuto in un file di script, il data.table viene stampato immediatamente:

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

Ma se print(Tbl) viene omesso dallo script lima, print sulla console ha bisogno di ancora due tentativi:

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

Qualcuno può dirmi quando ans perché print ha bisogno di due tentativi? Sto usando R versione 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 

Il sistema operativo è Windows 7.

+6

cura di rimuovere tutti i + e i> in modo che il codice possa essere facilmente gestito da qualcuno che tenti di rispondere alla tua domanda? –

+3

[probabilmente correlato] (http://stackoverflow.com/questions/32988099/data-table-objects-not-printed-after-returned-from-function) – Cath

+0

Perché fa la differenza se 'print (Tbl)' è contenuto in un file di script o no? – mra68

risposta

3

Citando il (fix 1. bug nella versione 1.9.6) NEWS:

if (TRUE) DT[,LHS:=RHS] non stampa più, # 869 e # 1122. Test aggiunti. Per arrivare a questo lavoro abbiamo dovuto convivere con un rovescio della medaglia: se un := è utilizzato all'interno di una funzione senza DT[] prima della fine della funzione, allora la prossima volta DT o print(DT) viene digitato al prompt, niente verrà stampato. Viene stampato un numero DT o print(DT) ripetuto. Per evitare ciò: include un DT[] dopo l'ultimo := nella tua funzione. Se ciò non è possibile (ad esempio, non è una funzione che è possibile modificare), è possibile stampare DT[] al prompt .

<- è una funzione. Ovviamente non dovresti usare lo <-. Crea una copia non necessaria (poiché := modifica la colonna data.table in posizione) ed è quindi inefficiente.