2016-03-01 22 views
5

Sto usando bash ai dati di tubo attraverso un Rscript in questo modo: cat random.csv | Rscript test.R arg >| delete.csv E 'possibile scrivere stdout usando write_csv() da readr?

Il mio obiettivo è quello di utilizzare il pacchetto readrR sia leggere standard input e scrive stdout. Ho trovato il answer to stdin here.

test.R

#!/usr/bin/Rscript 
suppressMessages(library(readr)) 

args <- commandArgs(trailingOnly = TRUE) 

df.in <- read_csv(file("stdin")) 

write_csv(df.in, path = stdout()) 

Il codice precedente produce il seguente messaggio di errore nella riga di comando:

messaggio di errore

Error in path.expand(path) : invalid 'path' argument 
Calls: write_csv -> write_delim -> normalizePath -> path.expand 
Execution halted 

Ho anche provato write_csv(df.in, file("stdout")) e write_csv(df.in, stdout()) produce lo stesso messaggio di errore.

Per la riproducibilità, ecco un link ad un random.csv

Definition of variables, by WHO for the Global Tuberculosis Report [43kb]

risposta

5

C'è una funzione format_csv per quella in readr. Utilizzare questo invece di write_csv:

cat(format_csv(df.in)) 
+2

Grazie @ m0nhawk - questo è molto vicino. Il messaggio di errore non viene più visualizzato. Tuttavia, 'delete.csv' ha tutti i dati stampati su una singola riga quando dovrebbero esserci più righe. Se avvolgi la tua risposta con 'cat()' il risultato è giusto in the money. per esempio. 'Cat (format_csv (df.in))'. Aggiorna e accetterò la tua risposta. –

1

per la lettura da stdin:

df.in <- read_csv(paste(collapse = "\n", readLines(file("stdin")))) 

per la scrittura su stdout:

writeLines(format_csv(tibble(a=c(1,2))), stdout()) 

#or 
writeLines(format_csv(df.in), stdout()) 

Complimenti a: jimhester

Problemi correlati