Обнаружение одиночных нажатий клавиш - PullRequest
12 голосов
/ 12 июля 2011

Несколько раз я хотел обнаружить отдельные нажатия клавиш в R, но не смог найти ничего, кроме readline() или аналогичного.

Примером может служить интерактивное построение графика или просмотр данных и возможность измененияЗначения параметров с помощью клавиш со стрелками и автоматически обновлять график.Конечно, я мог бы использовать readline() и вместо пользовательской стрелки ввести пользовательский ввод "u", но я не нахожу это очень элегантным.

Может ли это быть сделано с помощью команды system(), читающей stdin вкаким-то образом?

РЕДАКТИРОВАТЬ: В другом месте мне сказали, что stdin также ждет нажатия на ввод, прежде чем что-либо делать, и что немедленный перехват нажатий клавиш зависит от конкретной системы и сложен для выполнения.Если кто-нибудь знает, как это сделать в Ubuntu 10.10 или в любой другой системе Linux / Unix, я был бы рад узнать.

Ответы [ 4 ]

11 голосов
/ 12 июля 2011

Очень зависящее от ОС решение. Сначала немного кода C в getkey3.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 . Старт Р.

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

затем нажмите клавишу, она должна вернуть список с первым элементом в качестве целочисленного значения кода ASCII этой клавиши. Сохраните его в переменной R, если хотите.

У меня работает в Ubuntu, вы самостоятельно работаете с другими операционными системами.

Barry

4 голосов
/ 12 июля 2011

Если вы не возражаете против использования графического инструментария, такого как 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

Хотя некоторые основные вещи не выполняются: стрелка вверх, стрелка вниз может не отображаться, модификаторы и т. Д.

2 голосов
/ 12 июля 2011

Я не использовал R FFI долгое время, но вы можете вызвать с ней функцию C getchar (), верно?

в типе R:? .C

Раньше я писал крошечный .dll, чтобы обернуть некоторые пользовательские C-функции, а затем вызывал их с помощью .C (), однако это было в Win. Способ сборки dll в Linux другой, но я предполагаю, что способ вызова dll такой же.

1 голос
/ 21 августа 2012

Это более общее решение: C неблокирующий ввод с клавиатуры . Особенно это восстанавливает поведение терминала после того, как он был убит или обналичен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...