Escreva linhas de texto em um arquivo em R


341

Na linguagem de script R, como escrevo linhas de texto, por exemplo, as duas linhas a seguir

Hello
World

para um arquivo chamado "output.txt"?

Respostas:


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

7
Mark - what Se eu tiver vários threads, todos os quais gostaria de adicionar linhas ao mesmo arquivo? (O problema é que você não pode ter mais de uma conexão com um arquivo, se não me engano) Obrigado.
Tal Galili

8
@ Tal, que é uma excelente pergunta, você deve publicá-la como uma pergunta nova e separada, para que receba alguma atenção. Existem programadores R muito mais experientes por aqui do que eu!
Mark

8
Observe que isso requer que o arquivo "output.txt" já exista. Caso contrário, ele deve ser criado primeiro, por exemplo, usando 'file.create ("output.txt")'.
Jhin

20
@ jhin Não sei se isso é verdade. Usando rstudio 0,98 e R versão 3.1.0 o arquivo é criado automaticamente se ele não existe
JHowIX

4
A opção de writeLines()é cerca de dez vezes mais rápido, então a combinação de sink()ecat()
rafa.pereira

151

Na verdade, você pode fazer isso com sink():

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

portanto faça:

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

sink () não funciona no Databricks, tenha cuidado. Você pode usar colocar tudo isso dentro de uma função e chamar essa função como capture.output (chamada
funciton

109

Eu usaria o cat()comando como neste exemplo:

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

Você pode visualizar os resultados com R com

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

7
Ele constantemente abre e fecha um arquivo. Essa abordagem pode ser ineficiente.
Mlt

56

O que é um simples writeLines()?

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

ou

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

11
bom para mostrar que a entrada não tem que ser um vetor de linhas
tim

11
@tim Na verdade, "Hallo\nWorld"é um vetor de comprimento único do tipo de caractere. Apenas tentetxt <- "Hallo\nWorld"; is.character(txt) && length(txt) == 1 && is.vector(txt)
zero323

Isso funciona para mim apenas como writeLines(txt, con="outfile.txt").
Palec 13/04/2015

Não, deve funcionar sem nomear argumentos, desde que você dê um nome de arquivo válido como segundo argumento.
Petermeissner

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

17

Você poderia fazer isso em uma única declaração

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

13

Eu sugiro:

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

É mais curto e mais direto do que a resposta atual aceita. Não é necessário fazer:

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

Porque a documentação para writeLines()diz:

Se confor uma sequência de caracteres, a função chama filepara obter uma conexão de arquivo que é aberta durante a duração da chamada da função.

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

4

edição tidyverse com pipe e write_lines()de readr

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

3

Maneiras curtas de escrever linhas de texto em um arquivo em R poderiam ser realizadas com cat ou writeLines, como já mostrado em muitas respostas. Algumas das possibilidades mais curtas podem ser:

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

Caso não goste do "\ n", você também pode usar o seguinte estilo:

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

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

Enquanto o writeLines adiciona uma nova linha no final do arquivo, o que não é o caso do gato . Esse comportamento pode ser ajustado por:

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

Mas a principal diferença é que o gato usa objetos R e escreve um vetor de caracteres como argumento. Então, escrevendo, por exemplo, os números 1:10 precisam ser convertidos para writeLines, enquanto podem ser usados ​​como no gato:

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

2

Para completar as possibilidades, você pode usar writeLines()com sink(), se desejar:

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

Para mim, sempre parece mais intuitivo de usar print(), mas se você fizer isso, a saída não será o que você deseja:

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

2

Com base na melhor resposta :

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

Observe que as yourObjectnecessidades precisam estar em um formato de string; usaras.character() para converter se você precisar.

Mas isso é muita digitação para cada tentativa de salvamento. Vamos criar um trecho no RStudio.

Em Opções Globais >> Código >> Snippet, digite este:

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

Em seguida, durante a codificação, digite wfilee pressioneTab .


A file <- file(...)linha parece suspeita para mim. Não é ao mesmo tempo invocar filecomo função e atribuir fileum novo significado? Faz file()o trabalho mesmo depois de este pedaço de código é executado? Não têm acesso a uma instalação R me testar agora ...
Palec

ele trabalhou na minha configuração @Palec Você pode alterar arquivo para youFile se você tiver algum problema com palavras reservadas
Luis Martins

1

A opção feia do sistema

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

Que tal um simples write.table()?

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

Os parâmetros col.names = FALSEe row.names = FALSEcertifique-se de excluir os nomes de linha e coluna no txt, e o parâmetro quote = FALSEexclui essas aspas no início e no final de cada linha no txt. Para ler os dados novamente, você pode usar text = readLines("output.txt").


0

Nas versões mais recentes do R, writeLinespreservará retornos e espaços em seu texto; portanto, você não precisa incluir \nno final das linhas e pode gravar um grande pedaço de texto em um arquivo. Isso funcionará com o exemplo,

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

Mas você também pode usar essa configuração para simplesmente incluir texto com estrutura (quebras de linha ou recuos)

txt <- "Hello
   world
 I can 
   indent text!"
fileConn<-file("output.txt")
writeLines(txt, fileConn)
close(fileConn)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.