¿La causa del error de "número mágico incorrecto" al cargar un espacio de trabajo y cómo evitarlo?

93

Intenté cargar mi espacio de trabajo R y recibí este error:

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 

No estoy particularmente interesado en los detalles técnicos, pero sobre todo en cómo lo causé y cómo puedo prevenirlo en el futuro. Aquí hay algunas notas sobre la situación:

  1. Estoy ejecutando R 2.15.1 en una MacBook Pro con Windows XP en una partición de bootcamp.
  2. Obviamente, hay algo mal en este archivo de espacio de trabajo, ya que pesa solo ~ 80 kb, mientras que todos los demás suelen ser> 10,000
  3. Durante el fin de semana estuve ejecutando un programa de modelado externo en R y almacenando su salida en diferentes objetos. Ejecuté varias iteraciones del modelo en el transcurso de varios días, por ejemplo, output_Saturday <- call_model ()
  4. No hay nada especial en la salida del modelo, es solo una lista con ranuras para betas, matrices VC, especificación del modelo, etc.
N Brouwer
fuente
9
Adivina: no es un archivo de espacio de trabajo, es un registro de los comandos R.
Joshua Ulrich
4
Sospecho lo mismo, intente cargarlo con en source(filename)lugar de load(filename).
nograpes
Bummmer - Tendré que comprobarlo. Ojalá pudiera afirmar que fue un error de principiantes.
N Brouwer
1
Similar a lo que dijo @JoshuaUlrich, edité loadalgo que había write.tableeditado en lugar de saveed y obtuve este error. ¡Ups!
isomorfismos
Recibí este error cuando cargo una base de datos con load, dónde loadDbdebería usarse.
mt1022

Respuestas:

112

Recibí ese error cuando usé accidentalmente en load()lugar de source()o readRDS().

Chris SH
fuente
3
Yo también, cuando accidentalmente usé en load()lugar de read.csv(). : p
Waldir Leoncio
35
Yo también, parte 2, cuando usé accidentalmente en load()lugar de readRDS()(sí, 9 meses después, estoy de vuelta aquí por casi el mismo error).
Waldir Leoncio
34

También vale la pena señalar lo siguiente de un documento del R Core Team que resume los cambios en las versiones de R posteriores a la v3.5.0 ( aquí ):

R tiene un nuevo formato de serialización (versión 3) que admite la serialización personalizada de objetos de marco ALTREP ... Los datos serializados en formato 3 no pueden ser leídos por versiones de R anteriores a la versión 3.5.0.

Encontré este problema cuando guardé un espacio de trabajo en v3.6.0 y luego compartí el archivo con un colega que estaba usando v3.4.2. Pude resolver el problema agregando "version = 2" a mi función de guardado.

jhearn
fuente
2
¡Esto es increíblemente útil!
wolfsatthedoor
Esta es la forma.
user2961927
¡Gracias! Esto ayudó en mi caso (acababa de instalar R desde el repositorio de ubuntu, e intenté abrir un archivo RData que había creado hace unas semanas en otra máquina usando una versión un poco más nueva de R)
lebatsnok
18

Suponiendo que su archivo se llame "myfile.ext"

Si el archivo que está intentando cargar no es un script R, para lo cual usaría

source("myfile.ext")

puede probar la readRDSfunción y asignarla a un nombre de variable:

my.data <- readRDS("myfile.ext")
usuario2643170
fuente
9

El número mágico proviene de sistemas de tipo UNIX donde los primeros bytes de un archivo tenían un marcador que indicaba el tipo de archivo.

Este error indica que está intentando cargar un tipo de archivo no válido en R. Por alguna razón, R ya no reconoce este archivo como un archivo de espacio de trabajo de R.

Ellis Valentiner
fuente
6

Instale el readrpaquete, luego use library(readr).

Aurelia Aurita
fuente
1
Buen truco ... Tuve que probar un par de funciones de paquetes, pero readr::es fácil escanear las funciones. readr::read_rdses lo que funcionó para mí al final.
Matt Bannert
4

También ocurre cuando intenta load()un objeto rds en lugar de usar

object <- readRDS("object.rds")
DCZ
fuente
2

Recibí el error al construir un paquete R (usando roxygen2)

La causa en mi caso fue que había ahorrado data/mydata.RDatacon en saveRDS()lugar de save(). P.ejsave(iris, file="data/iris.RData")

Esto solucionó el problema para mí. Encontré esta información aquí

También tenga en cuenta que con save()/ load()el objeto se carga con el mismo nombre con el que se guardó inicialmente (es decir, no puede cambiarle el nombre hasta que ya esté cargado en el entorno R con el nombre que tenía cuando lo guardó inicialmente).

stevec
fuente
1

Tuve este problema cuando guardé el archivo Rdata en una versión anterior de R y luego intenté abrir en una nueva. Lo resolví actualizando mi versión R a la más nueva.

Juan Manuel Ortiz de Zarate
fuente
0

Si está trabajando con, devtoolsintente guardar los archivos con:

devtools::use_data(x, internal = TRUE)

Luego, elimine todos los archivos guardados anteriormente.

Desde doc:

internal Si es FALSE, guarda cada objeto en archivos .rda individuales en el directorio de datos. Están disponibles siempre que se carga el paquete. Si es TRUE, almacena todos los objetos en un solo archivo R / sysdata.rda. Estos objetos solo están disponibles dentro del paquete.

mariope
fuente