2016-03-01 12 views
5

Tôi đang sử dụng bash số liệu ống thông qua một Rscript như vậy: cat random.csv | Rscript test.R arg >| delete.csv Có thể viết stdout bằng write_csv() từ readr không?

Mục tiêu của tôi là sử dụng R gói readr cho cả đọc stdin và stdout viết. Tôi đã tìm thấy số 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()) 

Đoạn mã trên tạo ra thông báo lỗi sau tại cửa sổ dòng lệnh:

Thông báo lỗi

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

Tôi cũng đã cố gắng write_csv(df.in, file("stdout"))write_csv(df.in, stdout()) sản xuất cùng một thông báo lỗi.

Đối lặp lại, đây là một liên kết đến một random.csv

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

Trả lời

5

Có một chức năng format_csv cho rằng trong readr. Sử dụng điều này thay vì write_csv:

cat(format_csv(df.in)) 
+2

Cảm ơn @ m0nhawk - đây là rất gần. Thông báo lỗi không còn xuất hiện nữa. Tuy nhiên, 'delete.csv' có tất cả dữ liệu được in trên một hàng khi có nhiều hàng. Nếu bạn quấn câu trả lời của bạn với 'cat()', kết quả là đúng về số tiền. ví dụ. 'cat (format_csv (df.in))'. Cập nhật và tôi sẽ chấp nhận câu trả lời của bạn. –

1

để đọc từ stdin:

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

cho văn bản cho stdout:

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

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

Kudos to: jimhester

Các vấn đề liên quan