Viết các dòng văn bản vào một tệp trong R


341

Trong ngôn ngữ kịch bản R, làm cách nào để viết các dòng văn bản, ví dụ hai dòng sau

Hello
World

đến một tệp có tên "output.txt"?

Câu trả lời:


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

7
Đánh dấu - điều gì Nếu tôi có một số chủ đề tất cả trong số đó tôi muốn thêm dòng vào cùng một tệp? (Vấn đề là bạn không thể có nhiều hơn một kết nối đến một tệp, Nếu tôi không nhầm) Cảm ơn.
Tal Galili

8
@Tal, đó là một câu hỏi xuất sắc, bạn nên đăng nó dưới dạng một câu hỏi mới, riêng biệt để nó được chú ý. Có nhiều lập trình viên R am hiểu hơn ở đây hơn tôi!
Đánh dấu

8
Lưu ý rằng điều này yêu cầu tệp "output.txt" đã tồn tại. Nếu không, nó phải được tạo trước, ví dụ: sử dụng 'file.create ("output.txt")'.
jhin

20
@jhin Mình không chắc có đúng không. Sử dụng RStudio 0.98 và R phiên bản 3.1.0, tệp được tạo tự động nếu không tồn tại
JHowIX

4
Tùy chọn writeLines()nhanh hơn khoảng mười lần sau đó là sự kết hợp của sink()cat()
rafa.pereira

151

Trên thực tế bạn có thể làm điều đó với sink():

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

do đó làm:

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

hãy cẩn thận () không hoạt động trên Databricks. Bạn có thể sử dụng đặt tất cả những thứ này vào bên trong một hàm và gọi hàm này như capt.output (cuộc gọi funciton, tên tệp)
abdkumar

109

Tôi sẽ sử dụng cat()lệnh như trong ví dụ này:

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

Sau đó, bạn có thể xem kết quả từ với R với

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

7
Nó liên tục mở và đóng một tập tin. Cách tiếp cận này có thể không hiệu quả.
mlt

56

Điều gì đơn giản writeLines()?

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

hoặc là

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

1
thật tuyệt khi thấy rằng đầu vào không phải là một vectơ của dòng
tim

1
@tim Trên thực tế "Hallo\nWorld"là một vectơ dài của loại ký tự. Chỉ cần thửtxt <- "Hallo\nWorld"; is.character(txt) && length(txt) == 1 && is.vector(txt)
zero323

Điều này chỉ làm việc cho tôi như writeLines(txt, con="outfile.txt").
Palec

Không, nên hoạt động mà không đặt tên đối số miễn là bạn đặt tên tệp hợp lệ làm đối số thứ hai.
petermeissner

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

17

Bạn có thể làm điều đó trong một tuyên bố

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

13

Tôi đề nghị:

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

Nó ngắn hơn và trực tiếp hơn câu trả lời được chấp nhận hiện tại. Không cần thiết phải làm:

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

Bởi vì tài liệu cho writeLines()biết:

Nếu conlà một chuỗi ký tự, hàm sẽ gọi fileđể có được kết nối tệp được mở trong suốt thời gian của hàm gọi.

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

4

phiên bản gọn gàng với ống và write_lines()từ readr

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

3

Các cách ngắn để viết các dòng văn bản vào một tệp trong R có thể được nhận ra bằng cat hoặc writeLines như đã được hiển thị trong nhiều câu trả lời. Một số khả năng ngắn nhất có thể là:

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

Trong trường hợp bạn không thích "\ n", bạn cũng có thể sử dụng kiểu sau:

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

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

Trong khi writeLines thêm một dòng mới vào cuối tập tin, đây không phải là trường hợp của con mèo . Hành vi này có thể được điều chỉnh bởi:

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

Nhưng sự khác biệt chính là con mèo sử dụng các đối tượng RwriteLines một vectơ ký tự làm đối số. Vì vậy, viết ra, ví dụ, các số 1:10 cần được bỏ cho writeLines trong khi nó có thể được sử dụng như trên mèo:

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

2

Để làm tròn các khả năng, bạn có thể sử dụng writeLines()với sink(), nếu bạn muốn:

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

Đối với tôi, nó luôn có vẻ trực quan nhất để sử dụng print(), nhưng nếu bạn làm điều đó thì đầu ra sẽ không như bạn muốn:

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

2

Dựa trên câu trả lời tốt nhất :

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

Lưu ý rằng yourObjectcần phải ở định dạng chuỗi; sử dụng as.character()để chuyển đổi nếu bạn cần.

Nhưng điều này là quá nhiều gõ cho mỗi lần lưu. Hãy tạo một đoạn mã trong RStudio.

Trong Tùy chọn toàn cầu >> Mã >> Đoạn trích, nhập nội dung này:

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

Sau đó, trong quá trình mã hóa, wfilevà nhấnTab .


Các file <- file(...)dòng trông đáng ngờ đối với tôi. Không phải cả hai đều gọi filenhư là một chức năng và gán filemột ý nghĩa mới sao? Có file()hoạt động ngay cả sau khi đoạn mã này chạy? Không có quyền truy cập vào bản cài đặt R để tự kiểm tra ngay bây giờ ...
Palec

nó hoạt động trên thiết lập của tôi @Palec Bạn có thể thay đổi tệp thành youFile nếu bạn gặp một số vấn đề với các từ dành riêng
Luis Martins

1

Tùy chọn hệ thống xấu xí

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

Điều gì đơn giản write.table()?

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

Các tham số col.names = FALSErow.names = FALSEđảm bảo loại trừ các tên hàng và cột trong txt và tham số quote = FALSEloại trừ các dấu ngoặc kép ở đầu và cuối của mỗi dòng trong txt. Để đọc dữ liệu trở lại, bạn có thể sử dụng text = readLines("output.txt").


0

Trong các phiên bản mới hơn của R, writeLinessẽ giữ lại trả về và khoảng trắng trong văn bản của bạn, vì vậy bạn không cần đưa \nvào cuối dòng và bạn có thể viết một đoạn văn bản lớn vào một tệp. Điều này sẽ làm việc với ví dụ,

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

Nhưng bạn cũng có thể sử dụng thiết lập này để chỉ bao gồm văn bản có cấu trúc (ngắt dòng hoặc thụt lề)

txt <- "Hello
   world
 I can 
   indent text!"
fileConn<-file("output.txt")
writeLines(txt, fileConn)
close(fileConn)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.