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"?

Antworten:


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

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

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

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")

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)

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.

4

tidyverse ausgabe mit write_lines()pfeife und von readr

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

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))

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"

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 .


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

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").


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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.