Причина помилки “поганого магічного числа” при завантаженні робочої області та як її уникнути?


93

Я спробував завантажити свою робочу область R і отримав таку помилку:

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 

Мене не особливо цікавлять технічні деталі, а головним чином те, як я це спричинив і як я можу запобігти цьому в майбутньому. Ось кілька приміток щодо ситуації:

  1. Я використовую R 2.15.1 на MacBook Pro під управлінням Windows XP на розділі bootcamp.
  2. У цьому файлі робочої області щось очевидно не так, оскільки він важить лише ~ 80 кб, тоді як усі інші, як правило, перевищують 10 000
  3. На вихідних я запускав зовнішню програму моделювання в R і зберігав її результати для різних об'єктів. Я провів кілька ітерацій моделі протягом декількох днів, наприклад output_Saturday <- call_model ()
  4. У виведенні моделі немає нічого особливого, це лише список зі слотами для бета-версій, VC-матрицями, специфікацією моделі тощо.

9
Вгадайте: це не файл робочої області, це журнал команд R.
Джошуа Ульріх,

4
Я підозрюю те саме, спробуйте завантажити його source(filename)замість load(filename).
nograpes

Облом - доведеться перевірити. Я хотів би стверджувати, що це помилка для початківців.
N Brouwer

1
Подібно до того, що сказав @JoshuaUlrich, я loadвидав щось, що мав, write.tableа не saveЕда, і отримав цю помилку. На жаль
ізоморфізми

Отримав цю помилку під час завантаження бази даних load, де loadDbслід використовувати.
mt1022,

Відповіді:


112

Я отримав цю помилку, коли випадково використав load()замість source()або readRDS().


3
Так само я, коли випадково використовував load()замість read.csv(). : p
Вальдір Леонсіо

35
Так само я, частина 2, коли випадково використав load()замість readRDS()(так, через 9 місяців я повернувся сюди майже через ту ж помилку).
Вальдір Леонсіо

34

Також варто зауважити наступне з документа команди R Core, який підсумовує зміни у версіях R після v3.5.0 ( тут ):

R має новий формат серіалізації (версія 3), який підтримує користувацьку серіалізацію об’єктів фреймворку ALTREP ... Серіалізовані дані у форматі 3 не можуть бути прочитані версіями R до версії 3.5.0.

Я зіткнувся з цією проблемою, коли зберег робочу область у v3.6.0, а потім поділився файлом із колегою, який використовував v3.4.2. Я зміг вирішити проблему, додавши "version = 2" до моєї функції збереження.


2
Це неймовірно корисно!
wolfsatthedoor

Це шлях.
user2961927

Дякую! Це допомогло в моєму випадку (щойно встановив R зі сховища ubuntu - і спробував відкрити файл RData, який я створив кілька тижнів тому, на іншій машині, використовуючи трохи новішу версію R)
lebatsnok

18

Припускаючи, що ваш файл називається "myfile.ext"

Якщо файл, який ви намагаєтеся завантажити, не є R-сценарієм, для якого ви б використовували

source("myfile.ext")

ви можете спробувати readRDSфункцію і призначити її імені змінної:

my.data <- readRDS("myfile.ext")

9

Чарівне число походить від систем типу UNIX, де перші кілька байтів файлу містили маркер, що вказує на тип файлу.

Ця помилка означає, що ви намагаєтесь завантажити невірний тип файлу в R. З якоїсь причини R більше не розпізнає цей файл як файл робочої області R.


6

Встановіть readrпакет, а потім використовуйте library(readr).


1
Хороший фокус ... Мені довелося спробувати пару функцій пакетів, але за допомогою readr::них легко просканувати функції. readr::read_rdsце те, що зрештою спрацювало для мене.
Matt Bannert,

4

Це також відбувається, коли ви намагаєтесь отримати load()об'єкт rds замість використання

object <- readRDS("object.rds")

2

Я отримав помилку під час створення пакета R (за допомогою roxygen2)

Причина в моєму випадку було те , що я зібрав data/mydata.RDataз saveRDS()чим save(). Напрsave(iris, file="data/iris.RData")

Це вирішило проблему для мене. Я знайшов цю інформацію тут

Також зверніть увагу, що з save()/ load()об'єкт завантажується з тим самим іменем, з яким він спочатку зберігався (тобто ви не можете перейменовувати його, поки він вже не завантажений у середовище R під тим іменем, яке він мав, коли ви його спочатку зберігали).


1

У мене виникла ця проблема, коли я зберег файл Rdata у старій версії R, а потім спробував відкрити в новій. Я вирішив, оновивши свою версію R до найновішої.


0

Якщо ви працюєте, devtoolsспробуйте зберегти файли за допомогою:

devtools::use_data(x, internal = TRUE)

Потім видаліть усі збережені раніше файли.

З документа:

internal Якщо FALSE, зберігає кожен об'єкт в окремих файлах .rda в каталозі даних. Вони доступні щоразу, коли пакет завантажується. Якщо TRUE, усі об’єкти зберігаються в одному файлі R / sysdata.rda. Ці об'єкти доступні лише в пакеті.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.