Запишіть рядки тексту у файл на R


341

Як в мові сценаріїв R можу писати рядки тексту, наприклад наступні два рядки

Hello
World

у файл з назвою "output.txt"?

Відповіді:


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

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

8
@Tal, це відмінне запитання, ви можете поставити його як нове окреме запитання, щоб воно привернуло увагу. Тут набагато більше обізнаних програмістів R, ніж я!
Марк

8
Зауважте, що для цього потрібен файл "output.txt". Якщо цього немає, його слід створити спочатку, наприклад, використовуючи 'file.create ("output.txt")'.
jhin

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

sink () не працює на Databricks, будьте обережні. Ви можете використовувати поставити все це всередині функції та викликати таку функцію, як catch.output (функція виклику, ім'я файлу)
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
приємно показати, що вхід не повинен бути вектором рядків
Tim

1
@tim Насправді "Hallo\nWorld"це довжина одного вектора типу символів. Просто спробуйтеtxt <- "Hallo\nWorld"; is.character(txt) && length(txt) == 1 && is.vector(txt)
zero323

Це працює для мене лише як writeLines(txt, con="outfile.txt").
Палець

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

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 Ви можете змінити файл на файл, якщо у вас є проблеми із зарезервованими словами
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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.