几次我想检测R中的单个击键,但是除了readline()
或类似的东西什么都找不到。
一个示例是进行交互式绘图或数据浏览,并能够使用箭头键更改参数值并自动更新绘图。当然,我可以使用readline()
并让用户输入“u”,而不是向上箭头,但是我觉得它不是很优雅。
可以用system()
命令以某种方式读取stdin来完成吗?
编辑:我现在在其他地方被告知,stdin在执行任何操作之前还必须等待回车,并且立即捕获击键是特定于系统的,并且很难完成。如果有人知道如何在 ubuntu 10.10 或任何其他Linux/unix系统上执行此操作,我将很高兴知道。
最佳答案
非常依赖于操作系统的解决方案。首先在 getkey3.c 中添加一些C代码:
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
void mygetch ( int *ch )
{
struct termios oldt, newt;
tcgetattr ( STDIN_FILENO, &oldt );
newt = oldt;
newt.c_lflag &= ~( ICANON | ECHO );
tcsetattr ( STDIN_FILENO, TCSANOW, &newt );
*ch = getchar();
tcsetattr ( STDIN_FILENO, TCSANOW, &oldt );
return;
}
使用为R编译R CMD SHLIB getkey3.c
生成 getkey3.so 。启动R。
> dyn.load("getkey3.so")
> .C("mygetch",as.integer(0))
然后按一个键,它将返回一个列表,其中第一个元素为该键的ASCII码的整数值。如果需要,将其存储在R变量中。
在Ubuntu上为我工作,对于任何其他操作系统,您都是自己的。
巴里
关于r - 检测单次击键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6662646/