我有一个包含数字列表的文件(自己制作: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文件中跳过行,而我的输入只是一个数字列表。
答案 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的文件已被吃掉。