Escribir líneas de texto en un archivo en R

341

En el lenguaje de programación R, ¿cómo escribo líneas de texto, por ejemplo, las dos líneas siguientes?

Hello
World

a un archivo llamado "output.txt"?

amarillion
fuente

Respuestas:

420
fileConn<-file("output.txt")
writeLines(c("Hello","World"), fileConn)
close(fileConn)
marca
fuente
77
Marca: ¿qué sucede si tengo varios subprocesos, todos los cuales me gustaría agregar líneas al mismo archivo? (El problema es que no puede tener más de una conexión a un archivo, si no me equivoco) Gracias.
Tal Galili
8
@Tal, esa es una excelente pregunta, debe publicarla como una pregunta nueva y separada para que reciba algo de atención. ¡Aquí hay programadores de R mucho más informados que yo!
Mark
8
Tenga en cuenta que esto requiere que el archivo "output.txt" ya exista. Si no es así, primero debe crearse, por ejemplo, usando 'file.create ("output.txt")'.
jhin
20
@jhin No estoy seguro si eso es cierto. Usando RStudio 0.98 y R versión 3.1.0, el archivo se crea automáticamente si no existe
JHowIX
44
La opción de writeLines()es aproximadamente diez veces más rápida que la combinación de sink()ycat()
rafa.pereira
151

En realidad, usted puede hacerlo con sink():

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

por lo tanto hacer:

file.show("outfile.txt")
# hello
# world
aL3xa
fuente
sink () no funciona en Databricks, ten cuidado. Puede usar poner todo esto dentro de una función y llamar a esta función como capture.output (llamada de función, nombre de archivo)
abdkumar
109

Usaría el cat()comando como en este ejemplo:

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

Luego puede ver los resultados con R con

> file.show("outfile.txt")
hello
world
ps1
fuente
77
Constantemente abre y cierra un archivo. Este enfoque puede ser ineficiente.
mlt
56

¿Qué pasa con un simple writeLines()?

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

o

txt <- c("Hallo", "World")
writeLines(txt, "outfile.txt")
Petermeissner
fuente
1
Es bueno mostrar que la entrada no tiene que ser un vector de líneas
tim
1
@tim En realidad "Hallo\nWorld"es un vector de longitud uno del tipo de carácter. Solo inténtalotxt <- "Hallo\nWorld"; is.character(txt) && length(txt) == 1 && is.vector(txt)
zero323
Esto funciona para mí solo como writeLines(txt, con="outfile.txt").
Palec
no, debería funcionar sin nombrar argumentos siempre que proporcione un nombre de archivo válido como segundo argumento.
petermeissner
@petermeissner> coefficients<-summary(model) > writeLines(coefficients, "coefficients") Error in writeLines(coefficients, "coefficients") : invalid 'text' argument
alhelal
17

Podrías hacer eso en una sola declaración

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

Yo sugiero:

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

Es más corto y más directo que la respuesta actual aceptada. No es necesario hacer:

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

Porque la documentación de writeLines()dice:

Si cones una cadena de caracteres, la función llama filepara obtener una conexión de archivo que se abre mientras dura la llamada de función.

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

Edición tidyverse con tubo y write_lines()de lector

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

Las formas cortas de escribir líneas de texto en un archivo en R podrían realizarse con cat o writeLines como ya se muestra en muchas respuestas. Algunas de las posibilidades más cortas pueden ser:

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

En caso de que no le guste el "\ n", también puede usar el siguiente estilo:

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

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

Mientras writeLines agrega una nueva línea al final del archivo, no es el caso de cat . Este comportamiento podría 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

Pero la principal diferencia es que cat usa objetos R y escribe líneas de un vector de caracteres como argumento. Por lo tanto, escribir, p. Ej., Los números 1:10 se deben convertir en writeLines mientras se puede usar como está en cat:

cat(1:10)
writeLines(as.character(1:10))
GKi
fuente
2

Para completar las posibilidades, puede usar writeLines()con sink(), si lo desea:

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

Para mí, siempre parece más intuitivo de usar print(), pero si lo haces, la salida no será lo que deseas:

...
> print("Hello\nWorld")
...
[1] "Hello\nWorld"
gung - Restablece a Monica
fuente
2

Basado en la mejor respuesta :

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

Tenga en cuenta que yourObjectdebe estar en un formato de cadena; use as.character()para convertir si lo necesita.

Pero esto es escribir demasiado para cada intento de salvar. Creemos un fragmento en RStudio.

En Opciones globales >> Código >> Fragmento, escriba esto:

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

Luego, durante la codificación, escriba wfiley presioneTab .

Luis Martins
fuente
La file <- file(...)línea me parece sospechosa. ¿No es tanto invocar filecomo una función y asignar fileun nuevo significado? ¿ file()Funciona incluso después de que se ejecuta este fragmento de código? No tengo acceso a una instalación R para
probarme
funcionó en mi configuración @Palec Puede cambiar el archivo a usted Archivo si tiene algún problema con las palabras reservadas
Luis Martins
1

La opción del sistema feo

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
fuente
1

¿Qué tal un simple write.table()?

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

Los parámetros col.names = FALSEy row.names = FALSEasegúrese de excluir los nombres de fila y columna en el txt, y el parámetro quote = FALSEexcluye esas comillas al principio y al final de cada línea en el txt. Para volver a leer los datos, puede usar text = readLines("output.txt").

Druida Anciano
fuente
0

En las versiones más nuevas de R, writeLinesconservará retornos y espacios en su texto, por lo que no necesita incluirlos \nal final de las líneas y puede escribir una gran porción de texto en un archivo. Esto funcionará con el ejemplo,

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

Pero también podría usar esta configuración para incluir simplemente texto con estructura (saltos de línea o sangrías)

txt <- "Hello
   world
 I can 
   indent text!"
fileConn<-file("output.txt")
writeLines(txt, fileConn)
close(fileConn)
mikey
fuente