Tulis baris teks ke file dalam R

341

Dalam bahasa scripting R, bagaimana cara menulis baris teks, misalnya dua baris berikut

Hello
World

ke file bernama "output.txt"?

amarillion
sumber

Jawaban:

420
fileConn<-file("output.txt")
writeLines(c("Hello","World"), fileConn)
close(fileConn)
Menandai
sumber
7
Tandai - bagaimana Jika saya memiliki beberapa utas yang semuanya ingin saya tambahkan baris ke file yang sama? (Masalahnya adalah bahwa Anda tidak dapat memiliki lebih dari satu koneksi ke file, Jika saya tidak salah) Terima kasih.
Tal Galili
8
@Tal, itu adalah pertanyaan yang sangat bagus, Anda harus mempostingnya sebagai pertanyaan baru yang terpisah sehingga akan mendapat perhatian. Ada jauh lebih banyak programmer R yang berpengetahuan luas di sini daripada saya!
Mark
8
Perhatikan bahwa ini membutuhkan file "output.txt" sudah ada. Jika tidak, harus dibuat terlebih dahulu, misalnya menggunakan 'file.create ("output.txt")'.
jhin
20
@ Jon Saya tidak yakin apakah itu benar. Menggunakan RStudio 0.98 dan R versi 3.1.0 file dibuat secara otomatis jika tidak ada
JHowIX
4
Opsi writeLines()kira-kira sepuluh kali lebih cepat daripada kombinasi dari sink()dancat()
rafa.pereira
151

Sebenarnya Anda bisa melakukannya dengan sink():

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

maka lakukan:

file.show("outfile.txt")
# hello
# world
aL3xa
sumber
sink () tidak berfungsi pada Databricks hati-hati. Anda dapat menggunakan meletakkan semua ini di dalam suatu fungsi dan memanggil fungsi ini seperti capture.output (funciton call, filename)
abdkumar
109

Saya akan menggunakan cat()perintah seperti dalam contoh ini:

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

Anda kemudian dapat melihat hasil dari dengan R dengan

> file.show("outfile.txt")
hello
world
ps1
sumber
7
Itu terus-menerus membuka & menutup file. Pendekatan ini mungkin tidak efisien.
mlt
56

Bagaimana dengan yang sederhana writeLines()?

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

atau

txt <- c("Hallo", "World")
writeLines(txt, "outfile.txt")
petermeissner
sumber
1
Senang menunjukkan bahwa input tidak harus menjadi vektor garis
Tim
1
@tim Sebenarnya "Hallo\nWorld"adalah panjang satu vektor dari tipe karakter. Coba sajatxt <- "Hallo\nWorld"; is.character(txt) && length(txt) == 1 && is.vector(txt)
zero323
Ini hanya berfungsi untuk saya sebagai writeLines(txt, con="outfile.txt").
Palec
tidak, harus berfungsi tanpa penamaan argumen selama Anda memberikan nama file yang valid sebagai argumen kedua.
petermeissner
@petermeissner> coefficients<-summary(model) > writeLines(coefficients, "coefficients") Error in writeLines(coefficients, "coefficients") : invalid 'text' argument
alhelal
17

Anda bisa melakukannya dalam satu pernyataan

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

Saya menyarankan:

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

Itu lebih pendek dan lebih langsung daripada jawaban yang diterima saat ini. Tidak perlu melakukan:

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

Karena dokumentasi untuk writeLines()mengatakan:

Jika constring karakter, fungsi memanggil fileuntuk mendapatkan koneksi file yang dibuka selama durasi panggilan fungsi.

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

Edisi tidyverse dengan pipa dan write_lines()dari readr

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

Cara singkat untuk menulis baris teks ke file dalam R dapat diwujudkan dengan cat atau writeLines seperti yang telah ditunjukkan dalam banyak jawaban. Beberapa kemungkinan tersingkat adalah:

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

Jika Anda tidak menyukai "\ n", Anda juga dapat menggunakan gaya berikut:

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

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

Sementara writeLines menambahkan baris baru di akhir file yang bukan kasus kucing . Perilaku ini dapat disesuaikan dengan:

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

Tapi perbedaan utama adalah bahwa kucing menggunakan R objek dan writeLines sebuah vektor karakter sebagai argumen. Jadi menulis misalnya angka 1:10 perlu dicor untuk writeLines sementara itu dapat digunakan seperti pada kucing:

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

Untuk melengkapi kemungkinan, Anda dapat menggunakan writeLines()dengan sink(), jika Anda ingin:

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

Bagi saya, sepertinya selalu paling intuitif untuk digunakan print(), tetapi jika Anda melakukannya, hasilnya tidak seperti yang Anda inginkan:

...
> print("Hello\nWorld")
...
[1] "Hello\nWorld"
gung - Pasang kembali Monica
sumber
2

Berdasarkan jawaban terbaik :

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

Perhatikan bahwa yourObjectkebutuhan harus dalam format string; gunakan as.character()untuk mengkonversi jika Anda perlu.

Tapi ini terlalu banyak mengetik untuk setiap upaya penyelamatan. Mari kita membuat snippet di RStudio.

Dalam Opsi Global >> Kode >> Cuplikan, ketikkan ini:

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

Kemudian, selama coding, ketik wfiledan tekanTab .

Luis Martins
sumber
The file <- file(...)garis terlihat mencurigakan kepada saya. Bukankah itu keduanya memohon filesebagai fungsi dan menugaskan filemakna baru? Apakah file()bekerja bahkan setelah kode ini berjalan? Tidak memiliki akses ke instalasi R untuk menguji diri saya sekarang ...
Palec
itu berfungsi pada pengaturan saya @Palec Anda dapat mengubah file ke youFile jika Anda memiliki masalah dengan kata
Luis Martins
1

Opsi sistem yang jelek

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

Bagaimana dengan yang sederhana write.table()?

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

Parameter col.names = FALSEdan row.names = FALSEpastikan untuk mengecualikan nama baris dan kolom di txt, dan parameter quote = FALSEtidak termasuk tanda kutip di awal dan akhir setiap baris di txt. Untuk membaca kembali data, Anda dapat menggunakan text = readLines("output.txt").

Penatua Druid
sumber
0

Dalam versi R yang lebih baru, writeLinesakan mempertahankan pengembalian dan spasi dalam teks Anda, sehingga Anda tidak perlu memasukkan \ndi akhir baris dan Anda dapat menulis satu potongan besar teks ke file. Ini akan berfungsi dengan contoh,

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

Tetapi Anda juga bisa menggunakan pengaturan ini untuk hanya memasukkan teks dengan struktur (linebreak atau indentasi)

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