检测单击键

时间:2011-07-12 10:18:09

标签: r

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

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

可以用system()命令以某种方式读取标准输入吗?

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

4 个答案:

答案 0 :(得分:11)

非常依赖操作系统的解决方案。首先是 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 CMD SHLIB getkey3.c

编译R

产生 getkey3.so 。开始R.

 > dyn.load("getkey3.so")
 > .C("mygetch",as.integer(0))

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

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

百里

答案 1 :(得分:4)

如果您不介意插入图形工具包,例如tcltk或RGtk2,那么gWidgets包可以检测文本编辑小部件中的简单按键。例如:

require(gWidgets)
w <- gwindow("Detect keystrokes", visible=FALSE)
e <- gedit("", cont=w)
addHandlerKeystroke(e, handler=function(h,...) {
  key <- h$key
  print(key)
})
visible(w) <- TRUE

它没有做一些基本的事情:uparrow,downarrow可能不显示,修饰符等。

答案 2 :(得分:2)

我很久没有使用过R FFI了,你可以用它调用C函数getchar()吧?

R类型中的

:?。C

我曾经写过一个小的.dll来包装一些自定义的C函数,然后使用.C()来调用它们,但是在Win上。在Linux中构建DLL的方法是不同的,但我认为调用dll的方式是相同的。

答案 3 :(得分:1)

这是一个更通用的解决方案:C non-blocking keyboard input。 特别是它在被杀或兑现后恢复终端行为。