Napisz wiersze tekstu do pliku w języku R

341

W języku skryptowym R, jak pisać wiersze tekstu, np. Dwa kolejne wiersze

Hello
World

do pliku o nazwie „output.txt”?

amarillion
źródło

Odpowiedzi:

420
fileConn<-file("output.txt")
writeLines(c("Hello","World"), fileConn)
close(fileConn)
znak
źródło
7
Mark - co jeśli mam kilka wątków, z których wszystkie chciałbym dodać linie do tego samego pliku? (Problem polega na tym, że nie możesz mieć więcej niż jednego połączenia z plikiem, jeśli się nie mylę) Dzięki.
Tal Galili
8
@Tal, to doskonałe pytanie, powinieneś opublikować je jako nowe, osobne pytanie, aby zyskało trochę uwagi. Jest tu o wiele więcej doświadczonych programistów R niż ja!
Mark
8
Zauważ, że wymaga to pliku „output.txt”, który już istnieje. Jeśli nie, najpierw należy go utworzyć, np. Za pomocą „file.create („ output.txt ”)”.
jhin
20
@jhin Nie jestem pewien, czy to prawda. Używając RStudio 0.98 i R w wersji 3.1.0 plik jest tworzony automatycznie, jeśli nie istnieje
JHowIX 10.09
4
Opcja writeLines()jest około dziesięć razy szybsza niż kombinacja sink()icat()
rafa.pereira
151

W rzeczywistości możesz to zrobić za pomocą sink():

sink("outfile.txt")
cat("hello")
cat("\n")
cat("world")
sink()

dlatego wykonaj:

file.show("outfile.txt")
# hello
# world
aL3xa
źródło
sink () nie działa na Databricks bądź ostrożny. Możesz użyć umieścić wszystkie te funkcje w funkcji i wywołać tę funkcję jak capture.output (wywołanie funciton, nazwa pliku)
abdkumar
109

Użyłbym cat()polecenia jak w tym przykładzie:

> cat("Hello",file="outfile.txt",sep="\n")
> cat("World",file="outfile.txt",append=TRUE)

Następnie możesz wyświetlić wyniki za pomocą R za pomocą

> file.show("outfile.txt")
hello
world
ps1
źródło
7
Ciągle otwiera i zamyka plik. To podejście może być nieefektywne.
mlt
56

Co jest prostego writeLines()?

txt <- "Hallo\nWorld"
writeLines(txt, "outfile.txt")

lub

txt <- c("Hallo", "World")
writeLines(txt, "outfile.txt")
petermeissner
źródło
1
miło jest pokazać, że wejście nie musi być wektorem linii
tim
1
@ tim W rzeczywistości "Hallo\nWorld"jest to jeden wektor typu znaku. Po prostu spróbujtxt <- "Hallo\nWorld"; is.character(txt) && length(txt) == 1 && is.vector(txt)
zero323,
Działa to tylko dla mnie writeLines(txt, con="outfile.txt").
Palec
nie, powinien działać bez nazywania argumentów, o ile podasz poprawną nazwę pliku jako drugi argument.
petermeissner
@petermeissner> coefficients<-summary(model) > writeLines(coefficients, "coefficients") Error in writeLines(coefficients, "coefficients") : invalid 'text' argument
alhelal
17

Możesz to zrobić w jednym oświadczeniu

cat("hello","world",file="output.txt",sep="\n",append=TRUE)
Charan Raj
źródło
13

Sugeruję:

writeLines(c("Hello","World"), "output.txt")

Jest krótszy i bardziej bezpośredni niż obecnie akceptowana odpowiedź. Nie trzeba wykonywać:

fileConn<-file("output.txt")
# writeLines command using fileConn connection
close(fileConn)

Ponieważ dokumentacja writeLines()mówi:

Jeśli conciąg znaków jest znakiem, funkcja wywołuje funkcję, fileaby uzyskać połączenie z plikiem, które jest otwarte na czas trwania wywołania funkcji.

# default settings for writeLines(): sep = "\n", useBytes = FALSE
# so: sep = "" would join all together e.g.
Gwang-Jin Kim
źródło
4

edycja tidyverse z potokiem i write_lines()czytnikiem

library(tidyverse)
c('Hello', 'World') %>% write_lines( "output.txt")
Jurij Barvinchenko
źródło
3

Za pomocą można zrealizować krótkie sposoby zapisywania wierszy tekstu do pliku w języku R cat lub writeLines, jak pokazano już w wielu odpowiedziach. Oto niektóre z najkrótszych możliwości:

cat("Hello\nWorld", file="output.txt")
writeLines("Hello\nWorld", "output.txt")

Jeśli nie podoba Ci się „\ n”, możesz również użyć następującego stylu:

cat("Hello
World", file="output.txt")

writeLines("Hello
World", "output.txt")

Podczas gdy writeLines dodaje nowy wiersz na końcu pliku, co nie jest prawdą cat . To zachowanie można skorygować poprzez:

writeLines("Hello\nWorld", "output.txt", sep="") #No newline at end of file
cat("Hello\nWorld\n", file="output.txt") #Newline at end of file
cat("Hello\nWorld", file="output.txt", sep="\n") #Newline at end of file

Ale główną różnicą jest to, że kot zastosowania R obiektom i writeLines do postaci wektorowej jako argument. Tak więc zapisując np. Liczby 1:10, należy użyć rzutowania dla writeLines, podczas gdy można go używać tak, jak jest w cat:

cat(1:10)
writeLines(as.character(1:10))
GKi
źródło
2

W uzupełnieniu możliwości, można skorzystać writeLines()z sink(), jeśli chcesz:

> sink("tempsink", type="output")
> writeLines("Hello\nWorld")
> sink()
> file.show("tempsink", delete.file=TRUE)
Hello
World

Dla mnie zawsze wydaje się najbardziej intuicyjny w użyciu print(), ale jeśli to zrobisz, wynik nie będzie taki, jak chcesz:

...
> print("Hello\nWorld")
...
[1] "Hello\nWorld"
gung - Przywróć Monikę
źródło
2

W oparciu o najlepszą odpowiedź :

file <- file("test.txt")
writeLines(yourObject, file)
close(file)

Zauważ, że yourObjectmusi być w formacie ciągu; użyj as.character()do konwersji, jeśli potrzebujesz.

Ale to za dużo pisania na każdą próbę zapisu. Utwórzmy fragment w RStudio.

W Opcje globalne >> Kod >> Snippet, wpisz to:

snippet wfile
    file <- file(${1:filename})
    writeLines(${2:yourObject}, file)
    close(file)

Następnie podczas kodowania wpisz wfilei naciśnijTab .

Luis Martins
źródło
file <- file(...)Linia wygląda podejrzanie mi. Czy nie jest to zarówno wywoływanie filejako funkcja, jak i przypisywanie filenowego znaczenia? Czy file()działa nawet po uruchomieniu tego fragmentu kodu? Nie mam dostępu do instalacji typu R, aby się teraz przetestować ...
Palec
działało na mojej konfiguracji @Palec Możesz zmienić plik na youFile, jeśli masz jakiś problem z zastrzeżonymi słowami
Luis Martins
1

Brzydka opcja systemu

ptf <- function (txtToPrint,outFile){system(paste(paste(paste("echo '",cat(txtToPrint),sep = "",collapse = NULL),"'>",sep = "",collapse = NULL),outFile))}
#Prints txtToPrint to outFile in cwd. #!/bin/bash echo txtToPrint > outFile
kpie
źródło
1

A co z prostym write.table()?

text = c("Hello", "World")
write.table(text, file = "output.txt", col.names = F, row.names = F, quote = F)

Parametry col.names = FALSEi row.names = FALSEupewnij się, że wykluczono nazwy wierszy i kolumn w txt, a parametr quote = FALSEwyklucza znaki cudzysłowu na początku i na końcu każdej linii w txt. Aby ponownie odczytać dane, możesz użyć text = readLines("output.txt").

Starszy Druid
źródło
0

W nowszych wersjach R writeLineszachowuje zwroty i spacje w tekście, więc nie musisz uwzględniać \nna końcu wierszy i możesz napisać jeden duży fragment tekstu do pliku. Będzie to działać z przykładem,

txt <- "Hello
World"
fileConn<-file("output.txt")
writeLines(txt, fileConn)
close(fileConn)

Ale możesz także użyć tego ustawienia, aby po prostu dołączyć tekst ze strukturą (podziały wierszy lub wcięcia)

txt <- "Hello
   world
 I can 
   indent text!"
fileConn<-file("output.txt")
writeLines(txt, fileConn)
close(fileConn)
Mikey
źródło