2014-07-24 13 views
7

Oto mój kod R:R write (append = TRUE) nadpisuje zawartość pliku

out = file('testfile') 
write('hello', file=out, append=T) 
write('world', file=out, append=T) 
close(out) 

Kiedy uruchomić ten (używając R 3.1.0), testfile zawiera następnie:

world 

Spodziewałem :

hello 
world 

To samo zachowanie się dzieje, jeśli mogę użyć cat() zamiast write(). Czemu? Jak mogę dołączyć do plików?

Odpowiedz

11

Musisz otworzyć pliku do zapisu:

out = file('testfile', 'w') 
... 

Gdy R otwiera się (lub nie otwiera) połączeń automatycznie jest nieco skomplikowany, ale to wyjaśnione w pomocy (?file).

Jeśli nie przekażemy numeru 'w', każde wywołanie write otworzy i zamknie plik, i myślę, że powoduje to dziwne zachowanie, które obserwujesz.

Jeśli chcesz otworzyć istniejący plik do dopisywania, użyj

out = file('testfile', 'a') 
+0

To dobrze i naprawdę niesamowite. Najpierw ten plik (nazwa) nie otwiera pliku, ale poza tym append = T nie robi tego, co mówi (jest to bezpośredni błąd, który bym powiedział, ciekawy, jeśli się zgodzisz). –

+0

Wydaje mi się, że plik (...) otwiera plik dla * czytania * i że podczas pisania do pliku już otwartego do odczytu, R próbuje obejść problem, a obejście daje dziwne wyniki. 'append = TRUE' robi to, co ma zrobić, jeśli wcześniej nie otwierasz pliku z' file', ale po prostu napisz 'write (" Hello "," filename ", append = TRUE)'. – JohnB

+0

Dobrze, rozumiem. Biorąc pod uwagę to obejście, czy zgadzasz się, że byłoby lepiej zrobić tak, aby zapis (append = T) z nie otwartym połączeniem pliku otworzy plik do dołączenia, zamiast go zastąpić? Wygląda na to, że warto byłoby załatać poprawkę do R. –

3

Wskazówkę przychodzi na stronie pomocy dla cat (co write jest opakowaniem dla):

append logiczne. Używane tylko wtedy, gdy plik argumentu jest nazwą pliku (a nie połączenie lub "| cmd"). Jeśli wyjście TRUE zostanie dołączone do pliku ; w przeciwnym razie nadpisze zawartość pliku.

Podczas korzystania z połączeń należy ustawić połączenie zostać otwarty dla dołączania np:

file('testfile', open="a")