Schreiben Sie Textzeilen in eine Datei in R.

341

Wie schreibe ich in der Skriptsprache R Textzeilen, z. B. die folgenden zwei Zeilen?

Hello
World

in eine Datei mit dem Namen "output.txt"?

Amarillion
quelle

Antworten:

420
fileConn<-file("output.txt")
writeLines(c("Hello","World"), fileConn)
close(fileConn)
Kennzeichen
quelle
7
Markieren - was ist, wenn ich mehrere Threads habe, von denen ich alle Zeilen zur gleichen Datei hinzufügen möchte? (Das Problem ist, dass Sie nicht mehr als eine Verbindung zu einer Datei haben können, wenn ich mich nicht irre) Danke.
Tal Galili
8
@Tal, das ist eine ausgezeichnete Frage, du solltest sie als neue, separate Frage posten, damit sie etwas Aufmerksamkeit erhält. Es gibt hier viel mehr sachkundige R-Programmierer als ich!
Mark
8
Beachten Sie, dass hierfür die Datei "output.txt" bereits vorhanden sein muss. Wenn dies nicht der Fall ist, muss es zuerst erstellt werden, z. B. mit 'file.create ("output.txt")'.
Jhin
20
@jhin Ich bin mir nicht sicher, ob das stimmt. Mit RStudio 0.98 und R Version 3.1.0 wird die Datei automatisch erstellt, wenn sie nicht vorhanden ist
JHowIX
4
Die Option von writeLines()ist ungefähr zehnmal schneller als die Kombination von sink()undcat()
rafa.pereira
151

Eigentlich kann man das machen mit sink():

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

daher:

file.show("outfile.txt")
# hello
# world
aL3xa
quelle
sink () funktioniert nicht bei Databricks, sei vorsichtig. Sie können all diese Elemente in eine Funktion einfügen und diese Funktion wie capture.output (Funktionsaufruf, Dateiname)
aufrufen
109

Ich würde den cat()Befehl wie in diesem Beispiel verwenden:

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

Sie können dann die Ergebnisse von mit R mit anzeigen

> file.show("outfile.txt")
hello
world
ps1
quelle
7
Es öffnet und schließt ständig eine Datei. Dieser Ansatz ist möglicherweise ineffizient.
Mlt
56

Was ist mit einem einfachen writeLines()?

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

oder

txt <- c("Hallo", "World")
writeLines(txt, "outfile.txt")
Petermeissner
quelle
1
schön zu zeigen, dass die Eingabe kein Linienvektor sein muss
Tim
1
@tim Ist eigentlich "Hallo\nWorld"ein Vektor der Länge eins des Zeichentyps. Versuchen txt <- "Hallo\nWorld"; is.character(txt) && length(txt) == 1 && is.vector(txt)
Sie es
Das funktioniert bei mir nur als writeLines(txt, con="outfile.txt").
Palec
Nein, sollte funktionieren, ohne Argumente zu benennen, solange Sie einen gültigen Dateinamen als zweites Argument angeben.
Petermeissner
@ Petermeissner> coefficients<-summary(model) > writeLines(coefficients, "coefficients") Error in writeLines(coefficients, "coefficients") : invalid 'text' argument
Alhelal
17

Sie können dies in einer einzigen Anweisung tun

cat("hello","world",file="output.txt",sep="\n",append=TRUE)
Charan Raj
quelle
13

Ich schlage vor:

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

Es ist kürzer und direkter als die aktuell akzeptierte Antwort. Es ist nicht notwendig zu tun:

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

Weil die Dokumentation für writeLines()sagt:

Wenn das coneine Zeichenfolge ist, ruft die Funktion fileauf, um eine Dateiverbindung zu erhalten, die für die Dauer des Funktionsaufrufs geöffnet wird.

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

tidyverse ausgabe mit write_lines()pfeife und von readr

library(tidyverse)
c('Hello', 'World') %>% write_lines( "output.txt")
Yuriy Barvinchenko
quelle
3

Kurze Möglichkeiten zum Schreiben von Textzeilen in eine Datei in R können mit cat oder writeLines realisiert werden, wie bereits in vielen Antworten gezeigt. Einige der kürzesten Möglichkeiten könnten sein:

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

Falls Ihnen das "\ n" nicht gefällt, können Sie auch den folgenden Stil verwenden:

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

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

Während writeLines am Ende der Datei eine neue Zeile hinzufügt, ist dies bei cat nicht der Fall . Dieses Verhalten kann angepasst werden durch:

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

Aber wesentlicher Unterschied besteht darin , dass Katze Verwendungen R Objekte und writelines ein Zeichen Vektor als Argument. Wenn Sie also z. B. die Zahlen 1:10 ausschreiben, müssen Sie diese für writeLines verwenden, während Sie sie wie in cat verwenden können:

cat(1:10)
writeLines(as.character(1:10))
GKi
quelle
2

Um die Möglichkeiten abzurunden, können Sie writeLines()mit verwenden sink(), wenn Sie möchten:

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

Für mich scheint es immer am intuitivsten zu sein print(), aber wenn Sie das tun, wird die Ausgabe nicht das sein, was Sie wollen:

...
> print("Hello\nWorld")
...
[1] "Hello\nWorld"
gung - Monica wieder einsetzen
quelle
2

Basierend auf der besten Antwort :

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

Beachten Sie, dass das yourObjectZeichenfolgenformat vorliegen muss. Verwenden as.character()Sie diese Option, um bei Bedarf zu konvertieren.

Dies ist jedoch zu viel Eingabe für jeden Speicherversuch. Lassen Sie uns ein Snippet in RStudio erstellen.

Geben Sie unter Globale Optionen >> Code >> Snippet Folgendes ein:

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

Dann bei der Kodierung, Typ wfileund drückenTab .

Luis Martins
quelle
Die file <- file(...)Leitung sieht für mich verdächtig aus. Ruft es nicht gleichzeitig fileals Funktion auf und weist ihm fileeine neue Bedeutung zu? Funktioniert es file()auch, nachdem dieser Code ausgeführt wurde? Ich habe momentan keinen Zugriff auf eine R-Installation, um mich selbst zu testen ...
Palec
es funktionierte auf meinem Setup @Palec Sie können die Datei in youFile ändern, wenn Sie ein Problem mit reservierten Wörtern haben
Luis Martins
1

Die hässliche Systemoption

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
quelle
1

Was ist mit einem einfachen write.table()?

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

Die Parameter col.names = FALSEund row.names = FALSEstellen Sie sicher, dass die Zeilen- und Spaltennamen im txt ausgeschlossen sind, und der Parameter quote = FALSEschließt diese Anführungszeichen am Anfang und Ende jeder Zeile im txt aus. Um die Daten wieder einzulesen, können Sie verwenden text = readLines("output.txt").

Elder Druide
quelle
0

In neueren Versionen von R writeLinesbleiben Rückgaben und Leerzeichen in Ihrem Text erhalten, sodass Sie nicht \nam Zeilenende einfügen müssen und einen großen Textblock in eine Datei schreiben können. Dies funktioniert mit dem Beispiel:

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

Sie können dieses Setup aber auch verwenden, um einfach Text mit Struktur einzuschließen (Zeilenumbrüche oder Einrückungen).

txt <- "Hello
   world
 I can 
   indent text!"
fileConn<-file("output.txt")
writeLines(txt, fileConn)
close(fileConn)
mikey
quelle