2016-03-01 11 views
5

Używam bash do danych za pośrednictwem rur Rscript tak: cat random.csv | Rscript test.R arg >| delete.csv Czy można napisać stdout używając write_csv() z readr?

Moim celem jest, aby korzystać z pakietu Rreadr zarówno do odczytu i zapisu stdin stdout. Znalazłem 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()) 

Powyższy kod generuje następujący komunikat o błędzie w wierszu poleceń:

Wiadomość Błąd

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

Próbowałem również write_csv(df.in, file("stdout")) i write_csv(df.in, stdout()) wyświetlając ten sam komunikat o błędzie.

Dla powtarzalności, oto link do random.csv

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

Odpowiedz

5

Jest format_csv funkcja, która w readr. Użyj tego zamiast write_csv:

cat(format_csv(df.in)) 
+2

Dzięki @ m0nhawk - to bardzo blisko. Komunikat o błędzie nie jest już wyświetlany. Jednak 'delete.csv' ma wszystkie dane wydrukowane w jednym wierszu, gdy powinno być wiele wierszy. Jeśli otoczysz swoją odpowiedź przez 'cat()', wynik jest odpowiedni dla pieniędzy. na przykład 'cat (format_csv (df.in))'. Zaktualizuj, a zaakceptuję twoją odpowiedź. –

1

do odczytu ze standardowego wejścia:

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

na piśmie do stdout:

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

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

Kudos do: jimhester

Powiązane problemy