2015-12-14 8 views
7

Czasami print potrzebuje dwie próby, aby wydrukować data.table:Kiedy i dlaczego "print" wymaga dwóch prób wydrukowania "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 
> 

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

Jeśli kod zawarty w pliku skrypcie data.table zostanie wydrukowany natychmiast:

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

Ale jeśli print(Tbl) jest pominięte w skrypcie Plik, print na konsoli ponownie potrzebuje dwóch prób:

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

Czy ktoś może mi powiedzieć, kiedy ans dlaczego print potrzebuje dwóch prób? używam wersji 3.2.2 R:

> 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 

system operacyjny Windows 7.

+6

czy usunąć wszystkie znaki + i>, aby kod mógł być łatwo uruchomiony przez osobę próbującą odpowiedzieć na twoje pytanie? –

+3

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

+0

Dlaczego robi różnicę, jeśli 'print (Tbl)' znajduje się w pliku skryptu, czy nie? – mra68

Odpowiedz

3

Cytując (fix 1. Bug w wersji 1.9.6) NEWS:

if (TRUE) DT[,LHS:=RHS] nie drukuje, # 869 i # 1122. Dodano testy. Aby to dostać się do pracy musieliśmy żyć z jedną wadę: jeśli := jest wykorzystywane wewnątrz funkcji bez DT[] przed końcem funkcji, to następnym razem DT lub print(DT) jest wpisany w wierszu polecenia, nic zostanie wydrukowany. Powtórzę drukowanie z powtarzanym DT lub print(DT). Aby tego uniknąć: obejmują DT[] po ostatniej := w swojej funkcji. Jeśli nie jest to możliwe (np. Nie jest to funkcja, którą można zmienić), to gwarantowane jest wydrukowanie DT[] przy znaku zachęty .

<- to funkcja. Oczywiście nie powinieneś w ogóle używać <-. Tworzy niepotrzebną kopię (ponieważ := modyfikuje kolumnę data.table na miejscu) i dlatego jest nieefektywna.