从标准输入读取字符

标签 r io

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

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)

但我似乎没有正确理解readChar()

最佳答案

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

  • 您使用q , cmdi并且永远不要分配它们,这会导致测试或分配中使用 undefined symbol 时立即出现错误和程序中止
  • 您测试 q在您的 while 的顶部循环但从不给它一个值(与上一点相关)
  • 您在向量中分配 i但从未设置为 1首先
  • 您误解了字符串连接的工作原理
  • 您误解了控制台输入的工作原理,它基本上是按行输入而不是按字符输入,因此您的方法存在致命的设计问题(blocking 没有区别)
  • 您以错误的方式终止;您的 ' 哨兵值' 仍然被分配。
  • 您打开一个控制台并且从不关闭它(尽管 stdin 可能没问题)
  • 您以错误的方式增长结果变量,但与所有其他问题相比,这并不重要

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

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()相反。

现在我检查了,我发现您显然也从不接受您提出的问题的答案。对于我们这个领域的人来说,这是一个……有趣的结果,他们有时将自己定义为完全与激励有关……

关于从标准输入读取字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41206443/

相关文章:

javascript - 如何指定行/列来应用R Shiny的回调函数?

C++ 从文本文件中读取并计算每行的总数 :

c - 无法在 C 中测试复制文件功能

bash - 如何在没有所需库的情况下将由于运行可执行文件而导致的系统错误重定向到文件?

r - 使用 purrr 设置新创建的嵌套列表的名称

r - 基于变量的着色点与 R ggpairs

assembly - 如何在 sparc V8 处理器中设置 TBR?

基于 Web 的 CSV 导出的 Java IO 异常

r - Cut() 错误 - 'breaks' 不是唯一的

r - 使用 facet_wrap 和 ggplot2 在每个方面绘制整个数据