几次我想检测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/

10-12 19:16