ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

linux-如何使用/ dev / stdin和read.csv()从终端读取输入?

2019-10-12 00:51:13  阅读:242  来源: 互联网

标签:r linux input stdin


我正在使用:

R version 3.0.0 (2013-04-03) -- "Masked Marvel"
Platform: x86_64-pc-linux-gnu (64-bit)

我尝试使用read.csv直接从终端输入一些CSV数据片段标题.

我遇到的问题可能与R skips lines from /dev/stdinread.csv, header on first line, skip second line有关,但又相异(问题的答案没有解释我在这里看到的内容),因此需要单独提出一个问题.

R似乎跳过标题行并将第二(数据)行视为标题:

R> d <- read.csv(file='/dev/stdin', header=TRUE) 
a,b
1,2
3,4
# hit CTRL-D twice here to end the input
# (this is also unexpected:
#  when reading a few lines interactively in bash, one CTRL-D suffices.
#  Why is doing it twice necessary in R?)

R> d
  X1 X2
1  3  4

R> colnames(d)
[1] "X1" "X2"

我找到了一种解决方法:由于默认情况下read.csv具有blank.lines.skip = TRUE,所以我在输入前加上一些空行.开始输入之前的5条空行似乎是使它按预期工作所需的最低要求.顺便说一句:包含5个空格的一行也可以,提示需要5个字节(或更多)的空白填充:

R> d <- read.csv(file='/dev/stdin', header=TRUE)





a,b
1,2
3,4
# Enter CTRL-D twice here to mark the end of terminal input

R> d
  a b
1 1 2
2 3 4

R> colnames(d)
[1] "a" "b"

问题:

>为什么第一个示例无法按预期运行?
>为什么需要5个空白行或空格(即使4个空格也不够)才能使其正常工作?
>是否有更好的方法可以直接从终端读取简短的csv代码段?
(我知道scan和readLines,但是我的数据已经是csv格式,因此我想使其尽可能简单地读取/解析/分配)

解决方法:

我认为您发布的第一个链接中的答案可能确实适用. R似乎在/ dev / stdin上创建了一个4字节的缓冲区.另外,如评论中所述,您可以改用stdin,它似乎可以正常工作. (尽管我仍然不明白为什么您必须两次按Ctrl D).

d <- read.csv(file='stdin', header=TRUE)
a,b
1,2
3,4
# Hit Control+D twice.
> d
  a b
1 1 2
2 3 4

标签:r,linux,input,stdin
来源: https://codeday.me/bug/20191012/1896676.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有