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.