2016-03-01 16 views
5

Ich verwende bash zu Rohrdaten durch eine Rscript etwa so: cat random.csv | Rscript test.R arg >| delete.csv Ist es möglich, stdout mit write_csv() aus readr zu schreiben?

Mein Ziel, die R Paket readr sowohl verwenden lesen stdin und stdout schreiben. Ich habe die answer to stdin here gefunden.

test.r

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

args <- commandArgs(trailingOnly = TRUE) 

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

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

Der obige Code erzeugt die folgende Fehlermeldung in der Befehlszeile:

Fehlermeldung

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

ich auch write_csv(df.in, file("stdout")) versucht haben und write_csv(df.in, stdout()) produziert die gleiche Fehlermeldung.

Für Reproduzierbarkeit, hier ist ein Link zu einer random.csv

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

Antwort

5

Es gibt eine format_csv Funktion für das in readr. Verwenden Sie diese statt write_csv:

cat(format_csv(df.in)) 
+2

Thanks @ m0nhawk - das ist sehr nah. Die Fehlermeldung wird nicht mehr angezeigt. Die Datei "delete.csv" enthält jedoch alle Daten in einer einzelnen Zeile, wenn mehrere Zeilen vorhanden sein müssen. Wenn Sie Ihre Antwort mit 'cat()' verpacken, liegt das Ergebnis direkt am Geld. z.B. 'cat (format_csv (df.in))'. Aktualisieren Sie und ich werde Ihre Antwort akzeptieren. –

1

für von stdin zu lesen:

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

zum Schreiben auf stdout:

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

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

Ein großes Lob an: jimhester

Verwandte Themen