R Prompt User с автозаполнением - PullRequest
3 голосов
/ 25 января 2012

Есть ли в R способ запрашивать информацию у пользователя (например, scanf), а также разрешать автозаполнение этого приглашения, используя массив строк в качестве возможных дополнений?

По сути, ищем что-то вроде GNU Readline для R (в идеале с примером).

1 Ответ

5 голосов
/ 25 января 2012

Автозаполнение для имен функций и т. Д., По-видимому, является свойством среды разработки, в которой запущен R. Таким образом, он работает немного по-другому в графическом интерфейсе R по сравнению с затмением по сравнению с emacs по сравнению с RStudio по сравнению с любым другим.

Исходя из этого, я думаю, вы можете изо всех сил пытаться заставить автозаполнение работать переносимым способом для scanf / readline без существенных взломов.

Лучшим решением было бы создать собственный графический интерфейс, где вы управляете поведением. Вот пример использования gWidgets с выпадающим списком (он же combobox), выбор которого уменьшается в зависимости от того, что в него введено.

library(gWidgetstcltk) # or gWidgetsRGtk2, etc.
#some choices to complete to
choices <- c("football", "barometer", "bazooka")

#sort to make it easier for the user to find one, and 
#prepend with a blank string to type in
items <- c("", sort(choices))

#create a gui
win <- gwindow()
drp <- gdroplist(items = items, editable = TRUE, cont = win)

#When the user types something, update the list of available items 
#to those that begin with what has been typed.
addHandlerKeystroke(drp, handler = function(h, ...)
{
  regex <- paste("^", svalue(h$obj), sep = "")
  h$obj[] <- items[grepl(regex, items)]
})

Внутри этого обработчика h$obj ссылается на виджет выпадающего списка, svalue(h$obj) - это текущее выбранное значение, а h$obj[] - набор элементов.


Автозаполнение в R GUI (и, возможно, в других) построено на наборе функций в пакете utils (см. ?rcompgen). Копаться в источнике этого может быть полезно, но я все же думаю, что будет трудно заставить его работать, пока вы извлекаете пользовательский ввод, способом, который переносим между средами разработки. (Хотя я был бы счастлив, если бы ошибался.)

...