É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"?

amarillion
la source

Réponses:

420
fileConn<-file("output.txt")
writeLines(c("Hello","World"), fileConn)
close(fileConn)
marque
la source
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
aL3xa
la source
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
ps1
la source
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")
petermeissner
la source
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)
Charan Raj
la source
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.
Gwang-Jin Kim
la source
4

édition tidyverse avec pipe et write_lines()de readr

library(tidyverse)
c('Hello', 'World') %>% write_lines( "output.txt")
Yuriy Barvinchenko
la source
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))
GKi
la source
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"
gung - Rétablir Monica
la source
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 .

Luis Martins
la source
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
kpie
la source
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").

Ancien druide
la source
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)
mikey
la source