เขียนบรรทัดของข้อความไปยังไฟล์ใน R


341

ในภาษาสคริปต์ R ฉันจะเขียนบรรทัดข้อความได้อย่างไรเช่นสองบรรทัดต่อไปนี้

Hello
World

ไฟล์ที่ชื่อว่า "output.txt"?

คำตอบ:


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

7
ทำเครื่องหมาย - จะเกิดอะไรขึ้นถ้าฉันมีหลายเธรดซึ่งทั้งหมดนี้ฉันต้องการเพิ่มบรรทัดในไฟล์เดียวกัน (ปัญหาคือคุณไม่สามารถมีมากกว่าหนึ่งการเชื่อมต่อกับไฟล์ถ้าฉันไม่ผิด) ขอบคุณ
Tal Galili

8
@ ทัลนั่นเป็นคำถามที่ยอดเยี่ยมคุณควรโพสต์เป็นคำถามใหม่แยกต่างหากดังนั้นมันจะได้รับความสนใจ มีโปรแกรมเมอร์ R ที่มีความรู้มากมายกว่าฉัน!
Mark

8
โปรดทราบว่าสิ่งนี้ต้องการไฟล์ "output.txt" ที่มีอยู่แล้ว หากไม่เป็นเช่นนั้นจะต้องสร้างขึ้นก่อนเช่นใช้ 'file.create ("output.txt")'
jhin

20
@ จินฉันไม่แน่ใจว่าจริงหรือเปล่า การใช้ RStudio 0.98 และ R เวอร์ชัน 3.1.0 ไฟล์จะถูกสร้างขึ้นโดยอัตโนมัติหากไม่มีอยู่จริง
JHowIX

4
ตัวเลือกของwriteLines()คือประมาณสิบครั้งได้เร็วขึ้นแล้วการรวมกันของsink()และcat()
rafa.pereira

151

ที่จริงคุณสามารถทำได้ด้วยsink():

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

ดังนั้นทำ:

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

sink () ไม่ทำงานบน Databricks ต้องระวัง คุณสามารถใช้ใส่สิ่งเหล่านี้ไว้ภายในฟังก์ชั่นและเรียกใช้ฟังก์ชั่นนี้เช่น capture.output (การเรียก funciton, ชื่อไฟล์)
abdkumar

109

ฉันจะใช้cat()คำสั่งในตัวอย่างนี้:

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

จากนั้นคุณสามารถดูผลลัพธ์จากด้วย R ด้วย

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

7
มันเปิดและปิดไฟล์อย่างต่อเนื่อง วิธีการนี้อาจไม่มีประสิทธิภาพ
mlt

56

สิ่งที่เกี่ยวกับการที่เรียบง่ายwriteLines()?

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

หรือ

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

1
ยินดีที่ได้แสดงว่าอินพุตไม่จำเป็นต้องเป็นเวกเตอร์ของเส้น
ทิม

1
@tim จริง ๆ แล้ว"Hallo\nWorld"มีความยาวหนึ่งเวกเตอร์ของประเภทอักขระ เพิ่งลองtxt <- "Hallo\nWorld"; is.character(txt) && length(txt) == 1 && is.vector(txt)
zero323

writeLines(txt, con="outfile.txt")งานนี้สำหรับฉันเป็นเพียง
Palec

ไม่ควรทำงานโดยไม่มีการตั้งชื่ออาร์กิวเมนต์ตราบใดที่คุณให้ชื่อไฟล์ที่ถูกต้องเป็นอาร์กิวเมนต์ที่สอง
petermeissner

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


13

ฉันแนะนำ:

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

มันสั้นและตรงกว่าคำตอบที่ยอมรับในปัจจุบัน ไม่จำเป็นต้องทำ:

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

เพราะเอกสารสำหรับwriteLines()พูดว่า:

หากconเป็นสตริงอักขระฟังก์ชันfileจะเรียกใช้เพื่อรับการเชื่อมต่อไฟล์ที่เปิดขึ้นในช่วงระยะเวลาของการเรียกใช้ฟังก์ชัน

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


3

วิธีสั้น ๆ ในการเขียนบรรทัดข้อความไปยังไฟล์ใน Rสามารถรับรู้ได้ด้วยcatหรือwriteLinesดังที่แสดงในคำตอบมากมาย ความเป็นไปได้ที่สั้นที่สุดบางอย่างอาจเป็น:

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

ในกรณีที่คุณไม่ชอบ "\ n" คุณสามารถใช้สไตล์ดังต่อไปนี้:

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

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

ในขณะที่writeLinesเพิ่มขึ้นบรรทัดใหม่ในตอนท้ายของแฟ้มสิ่งที่ไม่เป็นกรณีสำหรับแมว พฤติกรรมนี้สามารถปรับได้โดย:

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

แต่ความแตกต่างที่สำคัญคือแมวใช้R วัตถุและwriteLines เวกเตอร์ตัวละครเป็นอาร์กิวเมนต์ ดังนั้นการเขียนออกมาเช่นหมายเลข1:10จะต้องมีการใช้งาน castLines ในขณะที่สามารถใช้งานได้เหมือนในแมว:

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

2

หากต้องการปัดเศษความเป็นไปได้คุณสามารถใช้writeLines()กับsink()หากคุณต้องการ:

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

สำหรับฉันดูเหมือนว่าใช้งานได้ง่ายที่สุดเสมอprint()แต่ถ้าคุณทำเช่นนั้นผลลัพธ์จะไม่เป็นอย่างที่คุณต้องการ:

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

2

ตามคำตอบที่ดีที่สุด :

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

โปรดทราบว่าyourObjectจำเป็นต้องอยู่ในรูปแบบสตริง ใช้as.character()ในการแปลงหากคุณต้องการ

แต่นี่คือการพิมพ์มากเกินไปสำหรับทุกครั้งที่พยายามบันทึก มาสร้างตัวอย่างใน RStudio กัน

ในตัวเลือกทั่วโลก >> รหัส >> ตัวอย่างให้พิมพ์สิ่งนี้:

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

จากนั้นในช่วงการเข้ารหัสประเภทwfileTabและกด


file <- file(...)สายดูน่าสงสัยให้ฉัน มันไม่ใช่ทั้งการเรียกใช้fileเป็นฟังก์ชั่นและการกำหนดfileความหมายใหม่หรือไม่? ไม่file()ทำงานแม้หลังจากที่ชิ้นส่วนของรหัสวิ่งนี้หรือไม่? ไม่สามารถเข้าถึงการติดตั้ง R เพื่อทดสอบตัวเองได้ในตอนนี้ ...
Palec

มันทำงานในการตั้งค่าของฉัน @Palec คุณสามารถเปลี่ยนไฟล์ให้กับคุณได้ถ้าคุณมีปัญหาเกี่ยวกับคำที่สงวนไว้
Luis Martins

1

ตัวเลือกระบบน่าเกลียด

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

สิ่งที่เกี่ยวกับที่เรียบง่ายwrite.table()?

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

พารามิเตอร์col.names = FALSEและrow.names = FALSEตรวจสอบให้แน่ใจว่าไม่รวมชื่อแถวและคอลัมน์ใน txt และพารามิเตอร์quote = FALSEไม่รวมเครื่องหมายคำพูดเหล่านั้นที่จุดเริ่มต้นและจุดสิ้นสุดของแต่ละบรรทัดใน txt text = readLines("output.txt")หากต้องการอ่านกลับข้อมูลในคุณสามารถใช้


0

ใน R เวอร์ชั่นใหม่writeLinesจะรักษาผลตอบแทนและช่องว่างในข้อความของคุณดังนั้นคุณไม่จำเป็นต้องรวม\nที่ท้ายบรรทัดและคุณสามารถเขียนข้อความขนาดใหญ่หนึ่งอันลงในไฟล์ได้ สิ่งนี้จะใช้ได้กับตัวอย่าง

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

แต่คุณสามารถใช้การตั้งค่านี้เพื่อรวมข้อความพร้อมโครงสร้าง (การกระจายหรือการเยื้อง)

txt <- "Hello
   world
 I can 
   indent text!"
fileConn<-file("output.txt")
writeLines(txt, fileConn)
close(fileConn)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.