2016-03-01 3 views
5

Я использую bash для данных труб через Rscript как так: cat random.csv | Rscript test.R arg >| delete.csv Можно ли написать stdout с помощью write_csv() из readr?

Моя цель состоит в том, чтобы использовать R пакет readr и чтение стандартного ввода и записи на стандартный вывод. Я нашел 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()) 

Приведенный выше код выдает следующее сообщение об ошибке в командной строке:

Сообщение об ошибке

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

Я также попытался write_csv(df.in, file("stdout")) и write_csv(df.in, stdout()) с тем же сообщением об ошибке.

Для воспроизводимости, вот ссылка на random.csv

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

ответ

5

Существует format_csv функция, которая в readr. Используйте вместо write_csv:

cat(format_csv(df.in)) 
+2

Спасибо @ m0nhawk - это очень близко. Сообщение об ошибке больше не отображается. Тем не менее, 'delete.csv' имеет все данные, напечатанные в одной строке, когда должно быть несколько строк. Если вы завершите свой ответ с помощью 'cat()', результат будет правильным на деньги. например 'Кот (format_csv (df.in))'. Обновите, и я приму ваш ответ. –

1

для чтения из стандартного ввода:

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

для записи на стандартный вывод:

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

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

Престижность: jimhester