Écrire des lignes de texte dans un fichier en R


341

Dans le langage de script R, comment écrire des lignes de texte, par exemple les deux lignes suivantes

Hello
World

dans un fichier nommé "output.txt"?

Réponses:


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

7
Mark - que se passe-t-il si j'ai plusieurs threads dont je voudrais ajouter des lignes au même fichier? (Le problème est que vous ne pouvez pas avoir plus d'une connexion à un fichier, si je ne me trompe pas) Merci.
Tal Galili

8
@Tal, c'est une excellente question, vous devez la poster en tant que nouvelle question distincte afin qu'elle retienne l'attention. Il y a beaucoup plus de programmeurs R compétents ici que moi!
Mark

8
Notez que cela nécessite que le fichier "output.txt" existe déjà. Si ce n'est pas le cas, il doit d'abord être créé, par exemple en utilisant 'file.create ("output.txt")'.
jhin

20
@jhin Je ne sais pas si c'est vrai. En utilisant RStudio 0.98 et R version 3.1.0, le fichier est créé automatiquement s'il n'existe pas
JHowIX

4
L'option de writeLines()est environ dix fois plus rapide que la combinaison de sink()andcat()
rafa.pereira

151

En fait, vous pouvez le faire avec sink():

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

donc:

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

Sink () ne fonctionne pas sur Databricks, soyez prudent. Vous pouvez utiliser mettre tout cela dans une fonction et appeler cette fonction comme capture.output (appel funciton, nom de fichier)
abdkumar

109

J'utiliserais la cat()commande comme dans cet exemple:

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

Vous pouvez ensuite afficher les résultats de avec R avec

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

7
Il ouvre et ferme constamment un fichier. Cette approche pourrait être inefficace.
mlt

56

Qu'en est-il d'un simple writeLines()?

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

ou

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

1
agréable de montrer que l'entrée n'a pas à être un vecteur de lignes
tim

1
@tim "Hallo\nWorld"est en fait un vecteur de longueur un du type caractère. Essayez simplementtxt <- "Hallo\nWorld"; is.character(txt) && length(txt) == 1 && is.vector(txt)
zero323

Cela ne fonctionne que pour moi writeLines(txt, con="outfile.txt").
Palec

Non, devrait fonctionner sans nommer d'arguments tant que vous donnez un nom de fichier valide comme deuxième argument.
petermeissner

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

17

Vous pouvez le faire en une seule déclaration

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

13

Je suggère:

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

Elle est plus courte et plus directe que la réponse actuellement acceptée. Il n'est pas nécessaire de faire:

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

Parce que la documentation de writeLines()dit:

S'il cons'agit d'une chaîne de caractères, la fonction appelle filepour obtenir une connexion de fichier qui est ouverte pendant la durée de l'appel de fonction.

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

4

édition tidyverse avec pipe et write_lines()de readr

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

3

Des méthodes courtes pour écrire des lignes de texte dans un fichier en R pourraient être réalisées avec cat ou writeLines comme déjà indiqué dans de nombreuses réponses. Certaines des possibilités les plus courtes pourraient être:

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

Si vous n'aimez pas le "\ n", vous pouvez également utiliser le style suivant:

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

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

Alors que writeLines ajoute une nouvelle ligne à la fin du fichier ce qui n'est pas le cas pour cat . Ce comportement pourrait être ajusté par:

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

Mais la principale différence est que cat utilise des objets R et writeLines un vecteur de caractères comme argument. Ainsi, écrire par exemple les nombres 1:10 doit être casté pour writeLines alors qu'il peut être utilisé comme dans cat:

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

2

Pour compléter les possibilités, vous pouvez utiliser writeLines()avec sink(), si vous le souhaitez:

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

Pour moi, il semble toujours plus intuitif à utiliser print(), mais si vous le faites, la sortie ne sera pas ce que vous voulez:

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

2

Basé sur la meilleure réponse :

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

Notez que le yourObjectdoit être dans un format de chaîne; utiliser as.character()pour convertir si vous en avez besoin.

Mais c'est trop taper pour chaque tentative de sauvegarde. Créons un extrait dans RStudio.

Dans Options globales >> Code >> Extrait, saisissez ceci:

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

Ensuite, pendant le codage, tapez wfileet appuyez surTab .


La file <- file(...)ligne me semble suspecte. N'est-ce pas à la fois invoquer fileen fonction et assigner fileun nouveau sens? Fonctionne-t-il file()même après l'exécution de ce morceau de code? Je n'ai pas accès à une installation R pour me tester en ce moment ...
Palec

cela a fonctionné sur ma configuration @Palec Vous pouvez changer le fichier en youFile si vous avez un problème avec les mots réservés
Luis Martins

1

L'option système laid

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

Et un simple write.table()?

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

Les paramètres col.names = FALSEet row.names = FALSEassurez-vous d'exclure les noms de ligne et de colonne dans le txt, et le paramètre quote = FALSEexclut ces guillemets au début et à la fin de chaque ligne du txt. Pour lire les données, vous pouvez utiliser text = readLines("output.txt").


0

Dans les versions plus récentes de R, writeLinespréservera les retours et les espaces dans votre texte, vous n'avez donc pas besoin d'inclure \nà la fin des lignes et vous pouvez écrire un gros morceau de texte dans un fichier. Cela fonctionnera avec l'exemple,

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

Mais vous pouvez également utiliser cette configuration pour simplement inclure du texte avec une structure (sauts de ligne ou retraits)

txt <- "Hello
   world
 I can 
   indent text!"
fileConn<-file("output.txt")
writeLines(txt, fileConn)
close(fileConn)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.