来自stdin的readChar

时间:2016-12-18 07:51:37

标签: r io

我想一次读取一个字符并将其转换为字符串命令,以便在输入空格后执行。 我试过了

<div id="parent_div">
  <div id="bluesquare_div"></div>
  <div id="yellowsquare_div"></div>
</div>

但我似乎无法正确理解con <- file("stdin") open(con, blocking=TRUE) while(q!=" "){ #q=scan("",what="", nmax=1) q=readChar(con,1) cmd[i]=q;i=i+1 } eval(cmd)

1 个答案:

答案 0 :(得分:4)

有趣的问题,但有一些缺陷:

  • 您使用qcmdi并且永远不会分配它们导致立即错误并且程序在测试或分配中使用的未定义符号中止
  • 您在q循环顶部测试while但从未给它一个值(与之前的点相关)
  • 您在向量中指定i但从未设置为1首先
  • 你误解了字符串连接是如何工作的
  • 你误解了控制台的输入是如何工作的,它基本上是由而不是字符所以你的方法有一个致命的设计问题(blocking没有区别)
  • 你以错误的方式终止;您的 sentinel 值“”仍然会被分配。
  • 你打开一个控制台并且从不关闭它(尽管stdin
  • 可能没问题
  • 你以错误的方式增长结果var,但与其他所有问题相比,这并不重要

如果我们稍微修改一下代码,并使用更好的空格,没有分号和<-用于分配(所有个人/公共偏好)我们得到

con <- file("stdin")
open(con, blocking=TRUE)
cmd <- q <- ""
i <- 1
while (q != " ") {
    q <- readChar(con,1)
    cmd[i] <- q
    i <- i+1
}
print(cmd)  # for exposition only
close(con)

并注意最终的print而不是eval,我们得到了这个(我输入了ls命令字母后跟空格)

$ Rscript /tmp/marcusloecher.R
ls 
[1] "l" "s" " "
$ 

我建议你改为readLines()

现在我检查了一下,我发现你显然也从不接受你问的问题的答案。对于我们这个领域的某个人来说,这是一个有趣的结果,有时将自己定义为关于激励的所有......