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

Respuestas:


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

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

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

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")

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)

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.

4

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

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

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))

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"

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 .


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

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").


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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.