La cause de l'erreur «mauvais nombre magique» lors du chargement d'un espace de travail et comment l'éviter?

93

J'ai essayé de charger mon espace de travail R et j'ai reçu cette erreur:

Error: bad restore file magic number (file may be corrupted) -- no data loaded
In addition: Warning message:
file ‘WORKSPACE_Wedding_Weekend_September’ has magic number '#gets'
   Use of save versions prior to 2 is deprecated 

Je ne suis pas particulièrement intéressé par les détails techniques, mais surtout par la façon dont je l'ai causé et comment je peux l'empêcher à l'avenir. Voici quelques notes sur la situation:

  1. J'exécute R 2.15.1 sur un MacBook Pro exécutant Windows XP sur une partition bootcamp.
  2. Il y a manifestement quelque chose qui ne va pas dans ce fichier d'espace de travail, car il ne pèse que ~ 80 Ko alors que tous mes autres sont généralement> 10000
  3. Au cours du week-end, j'ai exécuté un programme de modélisation externe dans R et stocké sa sortie dans différents objets. J'ai exécuté plusieurs itérations du modèle au cours de plusieurs jours, par exemple output_Saturday <- call_model ()
  4. Il n'y a rien de spécial dans la sortie du modèle, c'est juste une liste avec des emplacements pour les bêtas, les matrices VC, la spécification du modèle, etc.
N Brouwer
la source
9
Devinez: ce n'est pas un fichier d'espace de travail, c'est un journal des commandes R.
Joshua Ulrich
4
Je soupçonne la même chose, essayez de le charger avec source(filename)au lieu de load(filename).
nograpes
Bummmer - Devra vérifier. J'aimerais pouvoir prétendre que c'était une erreur de débutant.
N Brouwer
1
Semblable à ce que @JoshuaUlrich a dit, j'ai loadédité quelque chose que j'avais write.tableplutôt saveédité et j'ai obtenu cette erreur. Oups.
isomorphismes
Vous avez cette erreur lorsque je charge une base de données avec load, où loadDbdoit être utilisé.
mt1022

Réponses:

112

J'ai eu cette erreur lorsque j'ai utilisé accidentellement à la load()place de source()ou readRDS().

Chris SH
la source
3
Moi aussi, quand j'ai accidentellement utilisé à la load()place de read.csv(). : p
Waldir Leoncio
35
Moi aussi, partie 2, quand j'ai accidentellement utilisé load()au lieu de readRDS()(oui, 9 mois plus tard, je suis de retour ici pour à peu près la même erreur).
Waldir Leoncio
34

Il convient également de noter ce qui suit à partir d'un document de l'équipe R Core résumant les changements dans les versions de R après la v3.5.0 ( ici ):

R a un nouveau format de sérialisation (version 3) qui prend en charge la sérialisation personnalisée des objets du framework ALTREP ... Les données sérialisées au format 3 ne peuvent pas être lues par les versions de R antérieures à la version 3.5.0.

J'ai rencontré ce problème lorsque j'ai enregistré un espace de travail dans la v3.6.0, puis partagé le fichier avec un collègue qui utilisait la v3.4.2. J'ai pu résoudre le problème en ajoutant "version = 2" à ma fonction de sauvegarde.

jhearn
la source
2
C'est incroyablement utile!
wolfsatthedoor le
Ceci est le chemin.
user2961927
Merci! Cela a aidé dans mon cas (je venais d'installer R à partir du référentiel ubuntu - et j'ai essayé d'ouvrir un fichier RData que j'avais créé il y a quelques semaines sur une autre machine utilisant une version légèrement plus récente de R)
lebatsnok
18

En supposant que votre fichier s'appelle "myfile.ext"

Si le fichier que vous essayez de charger n'est pas un R-script, pour lequel vous utiliseriez

source("myfile.ext")

vous pouvez essayer la readRDSfonction et l'assigner à un nom de variable:

my.data <- readRDS("myfile.ext")
user2643170
la source
9

Le nombre magique provient des systèmes de type UNIX où les premiers octets d'un fichier contenaient un marqueur indiquant le type de fichier.

Cette erreur indique que vous essayez de charger un type de fichier non valide dans R. Pour une raison quelconque, R ne reconnaît plus ce fichier en tant que fichier d'espace de travail R.

Ellis Valentiner
la source
6

Installez le readrpackage, puis utilisez library(readr).

Aurelia Aurita
la source
1
Belle astuce ... J'ai dû essayer quelques fonctions de packs, mais readr::il est facile de parcourir les fonctions. readr::read_rdsest ce qui a fonctionné pour moi à la fin.
Matt Bannert
4

Cela se produit également lorsque vous essayez d' load()utiliser un objet rds au lieu d'utiliser

object <- readRDS("object.rds")
DCZ
la source
2

J'ai eu l'erreur lors de la construction d'un package R (en utilisant roxygen2)

La cause dans mon cas était que j'avais économisé data/mydata.RDataavec saveRDS()plutôt que save(). Par exemplesave(iris, file="data/iris.RData")

Cela a résolu le problème pour moi. J'ai trouvé cette information ici

Notez également qu'avec save()/ load()l'objet est chargé avec le même nom avec lequel il est initialement enregistré (c'est-à-dire que vous ne pouvez pas le renommer tant qu'il n'est pas déjà chargé dans l'environnement R sous le nom qu'il portait lors de son enregistrement initial).

stevec
la source
1

J'ai eu ce problème lorsque j'ai enregistré le fichier Rdata dans une ancienne version de R, puis j'ai essayé d'ouvrir dans une nouvelle. J'ai résolu en mettant à jour ma version R à la plus récente.

Juan Manuel Ortiz de Zarate
la source
0

Si vous travaillez avec, devtoolsessayez d'enregistrer les fichiers avec:

devtools::use_data(x, internal = TRUE)

Ensuite, supprimez tous les fichiers enregistrés précédemment.

De doc:

internal Si FALSE, enregistre chaque objet dans des fichiers .rda individuels dans le répertoire de données. Ceux-ci sont disponibles chaque fois que le package est chargé. Si TRUE, stocke tous les objets dans un seul fichier R / sysdata.rda. Ces objets ne sont disponibles que dans le package.

mariope
la source