将文字行写入R中的文件


341

在R脚本语言中,如何编写文本行,例如以下两行

Hello
World

到名为“ output.txt”的文件?

Answers:


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

7
马克-如果我有多个线程都想在同一文件中添加行怎么办?(问题是,如果我没记错的话,您不能与一个文件建立多个连接)。谢谢。
Tal Galili 2010年

8
@Tal,这是一个很好的问题,您应该将它发布为一个单独的新问题,以便引起关注。这里有比我更多知识渊博的R程序员!
标记

8
请注意,这需要文件“ output.txt”已经存在。如果不是,则必须首先创建它,例如使用'file.create(“ output.txt”)'。
jhin

20
@jhin我不确定这是否正确。如果不存在,则使用RStudio 0.98和R版本3.1.0自动创建文件
JHowIX 2014年

4
的选项比和writeLines()的组合大约快十倍sink()cat()
rafa.pereira 2015年

151

实际上,您可以使用sink()

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

因此:

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

注意:sink()在Databricks上不起作用。您可以将所有这些内容放到函数中,然后像capture.output(函数调用,文件名)一样调用该函数
abdkumar

109

我将使用cat()此示例中的命令:

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

然后,您可以使用R查看来自R的结果

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

7
它会不断打开和关闭文件。这种方法可能效率不高。
mlt

55

什么是简单的writeLines()

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

要么

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

1
很高兴证明输入不必是行向量
tim

1
@tim实际上"Hallo\nWorld"是字符类型的一个长度向量。试试看txt <- "Hallo\nWorld"; is.character(txt) && length(txt) == 1 && is.vector(txt)
zero323

这仅对我有效writeLines(txt, con="outfile.txt")
Palec 2015年

不,只要提供有效的文件名作为第二个参数,就应该在不命名参数的情况下工作。
petermeissner's

@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

如许多答案中所示,可以使用catwriteLines实现将文本行写入R中的文件的简短方法。最短的可能性包括:

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

如果您不喜欢“ \ n”,也可以使用以下样式:

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

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

writeLines在文件末尾添加换行符时,cat却不是这种情况。可以通过以下方式调整此行为:

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

但是主要的区别是cat使用R对象,并以字符向量writeLines作为参数。因此,写出数字1:10时,必须将其强制转换为writeLines,因为它可以像在cat中一样使用:

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)

然后,在编码过程中,键入wfile并按Tab


file <- file(...)条线对我来说可疑。既是file作为函数调用又是赋予file新的含义吗?难道file()连这一块代码运行后的工作?现在无权使用R安装进行自我测试……
Palec

它适用于我的设置@Palec如果保留字有问题,您可以将文件更改为youFile
Luis

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 = FALSErow.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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.