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

Jawaban:


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

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

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

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

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)

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.

4

Edisi tidyverse dengan pipa dan write_lines()dari readr

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

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

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"

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 .


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

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


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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.