2013-04-03 36 views
7

Etrafa Kafamı kurcalayan hakkında bir görünüm verilmiş ve sadece bu bulduk: kısmen yardımcı oluyor Do some programs not accept process substitution for input files?Süreç ikamesi

, ama gerçekten tam hikaye anlamak istiyorum. Süreç değiştirmeyi kullandığımda bazı R komut dosyalarının farklı (yani yanlış) sonuçlar verdiğini fark ettim.

Ben bir test vaka ile sorunu kesin olarak belirlemek için çalıştı:

Bu komut:

$ for i in `seq 1 10`; do echo $i >> p; done 
$ for i in `seq 1 500`; do cat p >> test; done 

bu beni götürüyor: Bu şekilde üretilen bir giriş dosyasıyla

#!/usr/bin/Rscript 

args <- commandArgs(TRUE) 
file <-args[1] 
cat(file) 
cat("\n") 
data <- read.table(file, header=F) 
cat(mean(data$V1)) 
cat("\n") 

:

$ ./mean.R test 
test 
5.5 

$ ./mean.R <(cat test) 
/dev/fd/63 
5.501476 

Diğer testler bazı hatların kaybolduğunu gösteriyor ... ama nedenini anlamak isterim. Read.table (tarama aynı sonuçları verir) kullanır mı kullanır?

Ps. Daha küçük bir test dosyası ile (100) bir hata bildirilir:

$./mean.R <(cat test3) 
/dev/fd/63 
Error in read.table(file, header = F) : no lines available in input 
Execution halted 

1. ekleyin: Sonuçlar aynıdır tarama kullanan bir modifiye komut dosyası ile.

Bir dosya benim kendi el yazısı bağlantı açma Bu genel amaçlı işlevi yazdım
+1

'read.table', sütun biçimlerini belirlemek için dosyaya göz atabilir ve daha sonra başa geri döndüğünde başarısız olabilir. (Sadece vahşi bir tahmin.) R betiğinizde kedi (head (data $ V1)) '' dırsanız ne olur? – krlmlr

+0

işlem yeniden yönlendirmesi ile '2 3 4 5 6 7', '1 2 3 4 5 6' olsun. Tüm veri çerçevelerini yazdırmak, onsuz 5001 satır (doğru) ve diğer durumda 3050 verir. Ayrıca, aramanın sorun olabileceğini düşünüyorum, ancak ... kısmi verilerle devam etmek yerine bir hata bildirmemeli midir? – vodka

+0

dosyada yukarı ve aşağı gidiyor kesinlikle sorun: https://stat.ethz.ch/pipermail/r-help/2007-September/141769.html ama yine de bir hata bildirilmesi gerektiğini düşünüyorum ve belki de bir böcek doldurun. Hala tarama ile aynı olup olmadığını araştırmak zorundayım (bu bana read.table ile aynı yanlış sonuçları verir). – vodka

cevap

8

: Kodunuzda

OpenRead <- function(arg) { 

    if (arg %in% c("-", "/dev/stdin")) { 
     file("stdin", open = "r") 
    } else if (grepl("^/dev/fd/", arg)) { 
     fifo(arg, open = "r") 
    } else { 
     file(arg, open = "r") 
    } 
} 

, file <- OpenRead(file) ile file değiştirip aşağıda tüm işlemesi gereken:

./mean.R test 
./mean.R <(cat test) 
cat test | ./mean.R - 
cat test | ./foo.R /dev/stdin 
+0

Evet, bu (ve aslında "/ dev/stdin" kullanarak problemleri fark ettim ve bir süre önce "stdin" e geçtim). Yine de bunun R'de bir hata olarak görülebileceğine inanıyorum ... – vodka