2013-10-10 22 views
5

Tôi có tệp văn bản được phân tách bằng tab mà tôi đang cố tải vào R bằng chức năng read.table. Một vài dòng đầu tiên của tập lệnh trông giống như thế nàychức năng read.table và stdin

#!/usr/bin/env Rscript 
args <- commandArgs(trailingOnly=TRUE) 
data <- read.table(args[1], header=TRUE, sep="\t", quote="") 
# process the data 

Công trình này hoạt động. Tôi đã cố gắng để có được R để đọc dữ liệu từ đầu vào tiêu chuẩn, nhưng đã không thành công. Cách tiếp cận đầu tiên của tôi ...

#!/usr/bin/env Rscript 
data <- read.table(stdin(), header=TRUE, sep="\t", quote="") 
# process the data 

... dường như không hoạt động. Cách tiếp cận thứ hai của tôi ...

#!/usr/bin/env Rscript 
data <- read.table("/dev/stdin", header=TRUE, sep="\t", quote="") 
# process the data 

... đọc các tập tin dữ liệu nhưng (đối với một số lý do tôi không hiểu) là người đầu tiên 20 hoặc lâu hơn dòng được đọc sai, mà là một vấn đề lớn (đặc biệt là kể từ khi những dòng chứa thông tin tiêu đề). Có cách nào để có được read.table để đọc từ đầu vào tiêu chuẩn không? Tôi có thiếu cái gì đó hoàn toàn hiển nhiên?

Trả lời

9

?stdin nói:

stdin() đề cập đến ‘console’ chứ không phải C-level ‘stdin’ của quá trình. Sự khác biệt quan trọng trong giao diện điều khiển GUI (trong đó có thể không có ‘stdin’ đang hoạt động và nếu chúng hoạt động có thể không phải là kết nối với đầu vào bảng điều khiển) và cũng trong các ứng dụng được nhúng. Nếu bạn muốn truy cập luồng tập tin cấp C ‘stdin’, hãy sử dụng file("stdin").

Và:

Khi R được đọc một kịch bản từ một tập tin, các tập tin là 'console': đây là việc sử dụng truyền thống để cho phép dữ liệu trong dòng ...

Đó là lý do có thể xảy ra đối với hành vi được quan sát. Về nguyên tắc bạn có thểread.table từ đầu vào tiêu chuẩn - nhưng trong hầu hết (gần như tất cả?) Trường hợp bạn sẽ muốn thực hiện điều này qua file('stdin').

+0

Rực rỡ. tập tin ("stdin") thay vì stdin() hoặc "/ dev/stdin" đã làm các trick. –