SfondoR - readRDS() e load() sicuro invia data.tables identiche all'originale
Ho provato a sostituire alcuni file di output CSV
con rds
file per migliorare l'efficienza. Questi sono file intermedi che serviranno da input per altri script R.
Domanda
ho iniziato a indagare quando i miei script non è riuscito e ha scoperto che readRDS()
e load()
non tornano identiche data tables
come l'originale. Questo dovrebbe succedere? O mi sono perso qualcosa?
codice di esempio
library(data.table)
aDT <- data.table(a=1:10, b=LETTERS[1:10])
saveRDS(aDT, file = "aDT.rds")
bDT <- readRDS(file = "aDT.rds")
identical(aDT, bDT, ignore.environment = T) # Gives 'False'
aDF <- data.frame(a=1:10, b=LETTERS[1:10])
saveRDS(aDF, file = "aDF.rds")
bDF <- readRDS(file = "aDF.rds")
identical(aDF, bDF, ignore.environment = T) # Gives 'True'
# Using 'save'& 'load' doesn't help either
aDT2 <- data.table(a=1:10, b=LETTERS[1:10])
save(aDT2, file = "aDT2.RData")
bDT2 <- aDT2; rm(aDT2)
load(file = "aDT2.RData")
identical(aDT2, bDT2, ignore.environment = T) # Gives 'False'
Sono in esecuzione R ver 3.2.0 su Linux Mint e testato con data.table
ver 1.9.4 e 1.9.5 (l'ultima).
La ricerca in SO e Google ha restituito this e this ma non penso che rispondano a questo problema. Sto ancora cercando di capire perché i miei script hanno fallito quando sono passato a rds
ma sto iniziando con questo.
Apprezzeremmo molto se i membri SO ben informati possono aiutare. Grazie!
Edit:
Ciao a tutti, mi è capitato di trovare un modo per risolvere il problema - hanno inviato la soluzione qui di seguito. Mi scuso se è piuttosto inelegante. Ora ho altre 2 domande:
(1) Esiste un modo migliore?
(2) È possibile eseguire qualcosa sul codice R
e/o data.table
per risolvere questo problema? Voglio dire, questo problema causa bug imprevedibili e non è la prima cosa che mi viene in mente. I miei 2 centesimi.
ma poi 'all.equal (ADT, BDT)' #TRUE – user20650
Hmm ... buona punto ... Ho sempre usato solo 'identico'. Andando attraverso? All.equal' mostra che si tratta di un test per 'quasi-uguaglianza', quindi forse la differenza è nei suggerimenti come menzionato dai 2 signori qui sotto? – NoviceProg