检测单击键

Bac*_*lin 12 r

有几次我想检测R中的单击键但是找不到任何其他东西readline()或类似的东西.

一个例子是进行交互式绘图或数据浏览,并能够使用箭头键更改参数值并自动更新绘图.当然我可以使用readline()并让用户输入"u"然后而不是向上箭头,但我发现它不是很优雅.

是否可以通过system()某种方式读取stdin 的命令来完成?

编辑:我现在已经被告知其他地方stdin也会在做任何事情之前等待一个输入中风,并且立即捕捉击键是系统特定的并且很难完成.如果有人知道如何在ubuntu 10.10或任何其他Linux/unix系统上执行此操作,我很高兴知道.

Spa*_*man 11

非常依赖OS的解决方案.首先在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;
}
Run Code Online (Sandbox Code Playgroud)

使用R CMD SHLIB getkey3.c编译R

这会产生getkey3.so.启动R.

 > dyn.load("getkey3.so")
 > .C("mygetch",as.integer(0))
Run Code Online (Sandbox Code Playgroud)

然后按一个键,它应该返回一个列表,第一个元素作为该键的ASCII码的整数值.如果需要,将其存储在R变量中.

在Ubuntu上为我工作,你可以自己为任何其他操作系统.

巴里