我想一次读入一个字符并将其转换为字符串命令,以便在输入空格后执行。 我试过了
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
,cmd
和i
并且永远不要分配它们,这会导致测试或分配中使用 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/