Записать строки текста в файл в R


341

На языке сценариев R, как мне написать строки текста, например, следующие две строки

Hello
World

в файл с именем "output.txt"?

Ответы:


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

7
Отметьте - что, если у меня есть несколько потоков, все из которых я хотел бы добавить строки в один файл? (Проблема в том, что вы не можете иметь более одного соединения с файлом, если я не ошибаюсь) Спасибо.
Тал Галили

8
@Tal, это отличный вопрос, вы должны опубликовать его как новый отдельный вопрос, чтобы он привлек некоторое внимание. Здесь гораздо более знающие программисты на R, чем я!
Mark

8
Обратите внимание, что для этого требуется, чтобы файл "output.txt" уже существовал. Если это не так, он должен быть создан первым, например, с помощью 'file.create ("output.txt")'.
Джин

20
@jhin Я не уверен, правда ли это. Используя 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

раковина () не работает на 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)
ноль323

Это работает для меня только как writeLines(txt, con="outfile.txt").
Палек

Нет, должен работать без именования аргументов, если в качестве второго аргумента вы указали правильное имя файла.
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 добавляет новую строку в конец файла, что не относится к 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

Но главное отличие в том , что кошка использует 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, если у вас есть проблемы с зарезервированными словами
Луис Мартинс

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убедитесь, что исключены имена строк и столбцов в текстовом формате, а параметр quote = FALSEисключает эти кавычки в начале и конце каждой строки в текстовом формате. Чтобы прочитать данные обратно, вы можете использовать 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)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.