A causa do erro de “número mágico ruim” ao carregar um espaço de trabalho e como evitá-lo?

93

Tentei carregar meu espaço de trabalho R e recebi este erro:

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 

Não estou particularmente interessado nos detalhes técnicos, mas principalmente em como eu causei isso e como posso evitá-lo no futuro. Aqui estão algumas notas sobre a situação:

  1. Estou executando o R 2.15.1 em um MacBook Pro executando o Windows XP em uma partição bootcamp.
  2. Há algo obviamente errado neste arquivo de espaço de trabalho, uma vez que ele pesa apenas ~ 80kb, enquanto todos os meus outros são geralmente> 10.000
  3. No fim de semana, eu estava executando um programa de modelagem externa em R e armazenando sua saída em diferentes objetos. Eu executei várias iterações do modelo ao longo de vários dias, por exemplo, output_Saturday <- call_model ()
  4. Não há nada de especial na saída do modelo, é apenas uma lista com slots para betas, matrizes VC, especificação do modelo, etc.
N Brouwer
fonte
9
Adivinhe: não é um arquivo de espaço de trabalho, é um log dos comandos R.
Joshua Ulrich
4
Eu suspeito o mesmo, tente carregá-lo com em source(filename)vez de load(filename).
nograpes
Bummmer - Terei que verificar. Eu gostaria de poder dizer que foi um erro de iniciante.
N Brouwer de
1
À semelhança do que @JoshuaUlrich disse, eu loaded algo que eu tinha write.tableed em vez de saveed e tenho esse erro. Opa.
isomorfismos
Recebo este erro quando carrego um banco de dados com load, onde loadDbdeveria ser usado.
mt1022

Respostas:

112

Recebi esse erro quando usei acidentalmente em load()vez de source()ou readRDS().

Chris SH
fonte
3
Eu também, quando acidentalmente usei em load()vez de read.csv(). : p
Waldir Leoncio
35
Eu também, parte 2, quando acidentalmente usei em load()vez de readRDS()(sim, 9 meses depois, estou de volta aqui para praticamente o mesmo erro).
Waldir Leoncio
34

Também vale a pena observar o seguinte em um documento da Equipe Central do R resumindo as alterações nas versões do R após a v3.5.0 ( aqui ):

R tem um novo formato de serialização (versão 3) que suporta serialização personalizada de objetos da estrutura ALTREP ... Dados serializados no formato 3 não podem ser lidos por versões de R anteriores à versão 3.5.0.

Eu encontrei esse problema quando salvei um espaço de trabalho na v3.6.0 e, em seguida, compartilhei o arquivo com um colega que estava usando a v3.4.2. Consegui resolver o problema adicionando "version = 2" à minha função de salvamento.

Jhearn
fonte
2
Isso é incrivelmente útil!
wolfsatthedoor
Este é o caminho.
user2961927
Obrigado! Isso ajudou no meu caso (tinha acabado de instalar o R ​​do repositório ubuntu - e tentei abrir um arquivo RData que criei há algumas semanas em outra máquina usando uma versão um pouco mais recente do R)
lebatsnok
18

Supondo que o nome do seu arquivo seja "myfile.ext"

Se o arquivo que você está tentando carregar não for um R-script, para o qual você usaria

source("myfile.ext")

você pode tentar a readRDSfunção e atribuí-la a um nome de variável:

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

O número mágico vem de sistemas do tipo UNIX onde os primeiros bytes de um arquivo continham um marcador indicando o tipo de arquivo.

Este erro indica que você está tentando carregar um tipo de arquivo inválido em R. Por algum motivo, R não reconhece mais este arquivo como um arquivo de espaço de trabalho R.

Ellis Valentiner
fonte
6

Instale o readrpacote e use-o library(readr).

Aurelia Aurita
fonte
1
Belo truque ... Eu tive que tentar algumas das funções de packs, mas com readr::é fácil verificar as funções. readr::read_rdsé o que funcionou para mim no final.
Matt Bannert,
4

Também ocorre quando você tenta load()um objeto rds em vez de usar

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

Recebi o erro ao construir um pacote R (usando roxygen2)

A causa no meu caso foi que eu havia economizado data/mydata.RDatacom, em saveRDS()vez de save(). Por exemplosave(iris, file="data/iris.RData")

Isso resolveu o problema para mim. Encontrei esta informação aqui

Observe também que com save()/ load()o objeto é carregado com o mesmo nome com que foi salvo inicialmente (ou seja, você não pode renomeá-lo até que já esteja carregado no ambiente R com o nome que tinha quando o salvou inicialmente).

Stevec
fonte
1

Tive esse problema quando salvei o arquivo Rdata em uma versão mais antiga do R e tentei abrir em uma nova. Resolvi atualizando minha versão R para a mais recente.

Juan Manuel Ortiz de Zarate
fonte
0

Se você estiver trabalhando com devtoolstente salvar os arquivos com:

devtools::use_data(x, internal = TRUE)

Em seguida, exclua todos os arquivos salvos anteriormente.

Do doc:

internal Se FALSE, salva cada objeto em arquivos .rda individuais no diretório de dados. Eles estão disponíveis sempre que o pacote é carregado. Se TRUE, armazena todos os objetos em um único arquivo R / sysdata.rda. Esses objetos estão disponíveis apenas no pacote.

mariope
fonte