R从/ dev / stdin跳过行

时间:2012-06-20 16:27:23

标签: r terminal

我有一个包含数字列表的文件(自己制作:for x in $(seq 10000); do echo $x; done > file)。

$> R -q -e "x <- read.csv('file', header=F); summary(x);"

> x <- read.csv('file', header=F); summary(x);
       V1       
 Min.   :    1  
 1st Qu.: 2501  
 Median : 5000  
 Mean   : 5000  
 3rd Qu.: 7500  
 Max.   :10000  

现在,人们可能希望cat文件和/dev/stdin的读取具有相同的输出,但它不会:

$> cat file | R -q -e "x <- read.csv('/dev/stdin', header=F); summary(x);"
> x <- read.csv('/dev/stdin', header=F); summary(x);
       V1       
 Min.   :    1  
 1st Qu.: 3281  
 Median : 5520  
 Mean   : 5520  
 3rd Qu.: 7760  
 Max.   :10000 

使用table(x)表示跳过了一堆行:

    1  1042  1043  1044  1045  1046  1047  1048  1049  1050  1051  1052  1053 
    1     1     1     1     1     1     1     1     1     1     1     1     1 
 1054  1055  1056  1057  1058  1059  1060  1061  1062  1063  1064  1065  1066 
    1     1     1     1     1     1     1     1     1     1     1     1     1
 ...

看起来R正在使用stdin做一些有趣的事情,因为这个Python会正确打印文件中的所有行:

cat file | python -c 'with open("/dev/stdin") as f: print f.read()'

This question似乎有关系,但它更多的是在格式错误的CSV文件中跳过行,而我的输入只是一个数字列表。

1 个答案:

答案 0 :(得分:3)

head --bytes=4K file | tail -n 3

得出这个:

1039
1040
104

这表明R在/ dev / stdin上创建一个大小为4KB的输入缓冲区,并在初始化期间填充它。当你的R代码读取/ dev / stdin时,它在此时从文件开始:

   1
1042
1043
...

的确,如果在档案中您将1041替换为1043,则table(x)中会得到“3”而不是“1”:

3  1042  1043  1044  1045  1046  1047  1048  1049  1050  1051  1052  1053 
1     1     1     1     1     1     1     1     1     1     1     1     1 
...

1中的第一个table(x)实际上是1041的最后一个数字。第一个4KB的文件已被吃掉。