Przyczyna błędu „złej liczby magicznej” podczas ładowania obszaru roboczego i jak go uniknąć?

97

Próbowałem załadować mój obszar roboczy R i otrzymałem ten błąd:

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 

Nie interesują mnie szczegóły techniczne, ale przede wszystkim to, jak to spowodowałem i jak mogę temu zapobiec w przyszłości. Oto kilka uwag dotyczących sytuacji:

  1. Używam wersji R 2.15.1 na MacBooku Pro z systemem Windows XP na partycji bootcamp.
  2. Jest coś oczywiście nie tak w tym pliku obszaru roboczego, ponieważ waży tylko ~ 80kb, podczas gdy wszystkie moje inne mają zwykle> 10 000
  3. Przez weekend uruchamiałem zewnętrzny program do modelowania w R i zapisywałem jego wyniki w różnych obiektach. Wykonałem kilka iteracji modelu w ciągu kilku dni, np. Output_Saturday <- call_model ()
  4. Nie ma nic specjalnego w wyjściu modelu, to tylko lista z gniazdami na wersje beta, matryce VC, specyfikację modelu itp.
N Brouwer
źródło
9
Zgadnij: to nie jest plik obszaru roboczego, to dziennik poleceń R.
Joshua Ulrich
4
Podejrzewam to samo, spróbuj go załadować source(filename)zamiast load(filename).
nografes
Bummmer - Będzie musiał sprawdzić. Chciałbym móc twierdzić, że to błąd początkujących.
N Brouwer
1
Podobny do tego, co @JoshuaUlrich mówiłem, loaded coś miałem write.tableed zamiast saveed i dostał ten błąd. Ups.
isomorphismes
Otrzymałem ten błąd, gdy ładuję bazę danych z load, gdzie loadDbpowinno być używane.
mt1022

Odpowiedzi:

114

Otrzymałem ten błąd, gdy przypadkowo użyłem load()zamiast source()lub readRDS().

Chris SH
źródło
3
Tak też zrobiłem, kiedy przypadkowo użyłem load()zamiast read.csv(). : p
Waldir Leoncio,
36
Podobnie jak ja, część 2, kiedy przypadkowo użyłem load()zamiast readRDS()(tak, 9 miesięcy później, wróciłem tutaj z powodu prawie tego samego błędu).
Waldir Leoncio
36

Warto również zwrócić uwagę na następujący fragment z dokumentu zespołu R Core Team podsumowującego zmiany w wersjach R po wersji 3.5.0 ( tutaj ):

R ma nowy format serializacji (wersja 3), który obsługuje niestandardową serializację obiektów struktury ALTREP ... Zserializowane dane w formacie 3 nie mogą być odczytywane przez wersje R przed wersją 3.5.0.

Napotkałem ten problem, gdy zapisałem obszar roboczy w wersji 3.6.0, a następnie udostępniłem plik koledze, który korzystał z wersji 3.4.2. Udało mi się rozwiązać ten problem, dodając „version = 2” do mojej funkcji zapisu.

jhearn
źródło
2
To jest niezwykle pomocne!
wolfsatthedoor
To jest sposób.
user2961927
Dzięki! Pomogło to w moim przypadku (właśnie zainstalowałem R z repozytorium ubuntu - i próbowałem otworzyć plik RData, który utworzyłem kilka tygodni temu na innym komputerze przy użyciu nieco nowszej wersji R)
lebatsnok
18

Zakładając, że twój plik nosi nazwę „myfile.ext”

Jeśli plik, który próbujesz załadować, nie jest skryptem R, którego użyjesz

source("myfile.ext")

możesz wypróbować readRDSfunkcję i przypisać ją do nazwy zmiennej:

my.data <- readRDS("myfile.ext")
user2643170
źródło
9

Magiczna liczba pochodzi z systemów typu UNIX, w których na pierwszych kilku bajtach pliku znajdował się znacznik wskazujący typ pliku.

Ten błąd wskazuje, że próbujesz załadować niepoprawny typ pliku do R. Z jakiegoś powodu R nie rozpoznaje już tego pliku jako pliku obszaru roboczego R.

Ellis Valentiner
źródło
6

Zainstaluj readrpakiet, a następnie użyj library(readr).

Aurelia Aurita
źródło
1
Niezła sztuczka ... Musiałem wypróbować kilka funkcji paczek, ale dzięki readr::temu łatwo je przeglądać. readr::read_rdsjest tym, co w końcu zadziałało.
Matt Bannert
4

Występuje również, gdy próbujesz load()użyć obiektu rds zamiast używać

object <- readRDS("object.rds")
DCZ
źródło
2

Wystąpił błąd podczas tworzenia pakietu R (przy użyciu roxygen2)

Przyczyną w moim przypadku było to, że uratował data/mydata.RDatasię saveRDS()zamiast save(). Na przykładsave(iris, file="data/iris.RData")

To rozwiązało problem. Znalazłem te informacje tutaj

Zauważ również, że z save()/ load()obiekt jest ładowany pod tą samą nazwą, pod którą jest początkowo zapisywany (tj. Nie możesz zmienić jego nazwy, dopóki nie zostanie załadowany do środowiska R pod nazwą, którą miał, kiedy go zapisałeś).

stevec
źródło
1

Miałem ten problem, kiedy zapisałem plik Rdata w starszej wersji R, a następnie próbowałem otworzyć w nowej. Rozwiązałem, aktualizując moją wersję R do najnowszej.

Juan Manuel Ortiz de Zarate
źródło
0

Jeśli pracujesz z, devtoolsspróbuj zapisać pliki za pomocą:

devtools::use_data(x, internal = TRUE)

Następnie usuń wszystkie zapisane wcześniej pliki.

Z dokumentu:

wewnętrzna Jeśli FALSE, zapisuje każdy obiekt w osobnych plikach .rda w katalogu danych. Są one dostępne za każdym razem, gdy pakiet jest ładowany. Jeśli PRAWDA, wszystkie obiekty są przechowywane w jednym pliku R / sysdata.rda. Te obiekty są dostępne tylko w pakiecie.

mariope
źródło