Scrivi righe di testo in un file in R


341

Nel linguaggio di scripting R, come posso scrivere righe di testo, ad esempio le seguenti due righe

Hello
World

in un file chiamato "output.txt"?

Risposte:


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

7
Segna: cosa succede se ho diversi thread tutti i quali vorrei aggiungere righe allo stesso file? (Il problema è che non puoi avere più di una connessione a un file, se non sbaglio) Grazie.
Tal Galili,

8
@Tal, questa è un'ottima domanda, dovresti pubblicarla come una nuova domanda separata in modo da attirare l'attenzione. Ci sono programmatori R molto più esperti qui intorno a me!
Segna il

8
Si noti che ciò richiede che il file "output.txt" sia già esistente. In caso contrario, è necessario prima crearlo, ad esempio utilizzando 'file.create ("output.txt")'.
jhin,

20
@jhin Non sono sicuro che sia vero. Utilizzando RStudio 0.98 e R versione 3.1.0 il file viene creato automaticamente se non esiste
JHowIX

4
L'opzione di writeLines()è circa dieci volte più veloce della combinazione di sink()ecat()
rafa.pereira

151

In realtà puoi farlo con sink():

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

quindi fai:

file.show("outfile.txt")
# hello
# world

sink () non funziona su Databricks, fai attenzione. Puoi usare tutte queste funzioni all'interno di una funzione e chiamare questa funzione come capture.output (funzione funzionale, nome file)
abdkumar

109

Vorrei usare il cat()comando come in questo esempio:

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

È quindi possibile visualizzare i risultati con R con

> file.show("outfile.txt")
hello
world

7
Si apre e chiude costantemente un file. Questo approccio potrebbe essere inefficiente.
mlt

56

Che dire di un semplice writeLines()?

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

o

txt <- c("Hallo", "World")
writeLines(txt, "outfile.txt")

1
bello mostrare che l'ingresso non deve essere un vettore di linee
tim

1
@tim In realtà "Hallo\nWorld"è un vettore di lunghezza di un tipo di carattere. Basta provaretxt <- "Hallo\nWorld"; is.character(txt) && length(txt) == 1 && is.vector(txt)
zero323

Questo funziona solo per me writeLines(txt, con="outfile.txt").
Palec,

no, dovrebbe funzionare senza assegnare argomenti ai nomi purché si dia un nome file valido come secondo argomento.
petermeissner,

@petermeissner> coefficients<-summary(model) > writeLines(coefficients, "coefficients") Error in writeLines(coefficients, "coefficients") : invalid 'text' argument
alhelal

17

Potresti farlo in una sola affermazione

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

13

Suggerisco:

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

È più breve e più diretto della risposta attualmente accettata. Non è necessario fare:

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

Perché la documentazione per writeLines()dice:

Se conè una stringa di caratteri, la funzione chiama fileper ottenere una connessione al file che viene aperta per la durata della chiamata di funzione.

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

4

edizione ordinata con pipe e write_lines()da readr

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

3

Brevi modi per scrivere righe di testo in un file in R potrebbero essere realizzati con cat o writeLines come già mostrato in molte risposte. Alcune delle possibilità più brevi potrebbero essere:

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

Nel caso in cui non ti piaccia la "\ n" puoi anche usare il seguente stile:

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

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

Mentre writeLines aggiunge una nuova riga alla fine del file, ciò che non è il caso di Cat . Questo comportamento potrebbe essere regolato da:

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

Ma la differenza principale è che cat usa oggetti R e writeLines un vettore di caratteri come argomento. Quindi scrivere per esempio i numeri 1:10 deve essere lanciato per writeLines mentre può essere usato com'è in cat:

cat(1:10)
writeLines(as.character(1:10))

2

Per arrotondare le possibilità, è possibile utilizzare writeLines()con sink(), se si desidera:

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

A me sembra sempre molto intuitivo da usare print(), ma se lo fai l'output non sarà quello che vuoi:

...
> print("Hello\nWorld")
...
[1] "Hello\nWorld"

2

Basato sulla migliore risposta :

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

Si noti che yourObjectdeve essere in un formato stringa; utilizzare as.character()per convertire se necessario.

Ma questo è troppo scrivere per ogni tentativo di salvataggio. Creiamo uno snippet in RStudio.

In Opzioni globali >> Codice >> Snippet, digitare questo:

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

Quindi, durante la codifica, digitare wfilee premereTab .


La file <- file(...)linea mi sembra sospetta. Non è sia invocare filecome una funzione che assegnare fileun nuovo significato? Fa file()il lavoro anche dopo questo pezzo di codice viene eseguito? Non ho accesso a un'installazione R per mettermi alla prova in questo momento ...
Palec,

ha funzionato sul mio setup @Palec Puoi cambiare il file in te File se hai qualche problema con le parole riservate
Luis Martins

1

La brutta opzione di sistema

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

Che ne dici di un semplice write.table()?

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

I parametri col.names = FALSEe row.names = FALSEassicurarsi di escludere i nomi di riga e colonna nel txt e il parametro quote = FALSEesclude quelle virgolette all'inizio e alla fine di ogni riga nel txt. Per rileggere i dati, è possibile utilizzare text = readLines("output.txt").


0

Nelle versioni più recenti di R, writeLinesmanterrà i ritorni e gli spazi nel testo, quindi non è necessario includere \nalla fine delle righe e puoi scrivere un grosso pezzo di testo in un file. Questo funzionerà con l'esempio,

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

Ma potresti anche usare questa configurazione per includere semplicemente testo con struttura (interruzioni di riga o rientri)

txt <- "Hello
   world
 I can 
   indent text!"
fileConn<-file("output.txt")
writeLines(txt, fileConn)
close(fileConn)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.