Функция программирования R без () - PullRequest
0 голосов
/ 15 ноября 2011

Итак, у меня есть следующий очень простой файл map.r.

Я пытаюсь, чтобы пользователь нажимал кнопку в интерактивном режиме, а затем использовал функцию.

Поскольку это функция, пользователь должен напечатать "click ()", как я могу сделать так, чтобы они имели только слово (без скобок), а затем заставить эту функцию что-то делать с img.

Итак, пользователь вводит:

mydist ( "image.pnm")

нажмите

// А затем функция click делает то, что должна

mydist <- function(mapfile) {

    img <- read.pnm(mapfile)

    plot(img)
}

click <- function() {

    //Prompt user to click on img
}

Ответы [ 4 ]

6 голосов
/ 15 ноября 2011

Если вы дадите ему собственный класс и метод печати, повторяющий это сообщение, вы сможете достичь своей цели.

  print.click <- function(x, ...){
    #
    # could do something here
    # the <something> could be a plot or calculation
    plot(1:10, 10:1, type="l")
   cat("Your click message here\n perhaps \n Downward line plotted!")
     invisible(x)
 }
 click <- "click"
 class(click) <- "click"


 click
# Your click message here
# perhaps 
# Downward line plotted!

Даже если вы хотите «инкапсулировать» определение класса в самом объекте, как продемонстрировал Аарон, вы не ограничитесь печатью сообщения. Вы могли бы сделать что-то вроде этого:

print.click <- function(x, ...) {plot(1:10, 10:1, type="l")
   cat("prompt user to click on img...\n")

Если вы хотите позвонить locator, вы можете расширить интерактивность с пользователем.

4 голосов
/ 15 ноября 2011

Вот «правильный» способ сделать это.Это пример из моего файла .Rprofile.

invisible(makeActiveBinding("newq", function(...){quartz();par(cex=.75); cat("OK\n")}, .GlobalEnv))  

Функция makeActiveBinding совершает какую-то магию, поэтому вся функция вызывается без необходимости в скобках.

1 голос
/ 15 ноября 2011

Я мог бы быть полностью смущен тем, что вы хотите сделать, но я думаю, что что-то вроде ниже может ответить на ваш запрос.Его можно расширить, добавив другие опции 'else-if' и другие пользовательские функции, которые будут запускаться в результате того, что пользователь вводит.

customfunction <- function() {
print(1:10)
}

mydist <- function(mapfile) {

   img <- read.pnm(mapfile)
   plot(img)

ANSWER <- readline("")

# customfunction() will be run (printing 1:10) as soon as 
# the user types "click" and hits enter

if (ANSWER=="click") customfunction()

}
1 голос
/ 15 ноября 2011

Вот один из способов сделать то, что вы просили.Однако может быть лучший способ сделать то, что вы пытаетесь сделать.

click <- structure(1, class="click")
print.click <- function(x, ...) {
  cat("prompt user to click on img...\n")
}

Тогда

> click
prompt user to click on img...
...