es c в readline () в R с сообщением () - PullRequest
1 голос
/ 15 апреля 2020

Проблема: Я пишу основную функцию, которая вкладывает другие подпрограммы, которые используют readline() для захвата пользовательского ввода в R. При использовании основной функции человек может захотеть прекратить использование функции во время части readline() подпрограммы, используя клавишу «es c». Нажатие клавиши «es c» полностью исключает пользователя из функции и всех объектов окружающей среды вместе с ней, но только , когда в основной функции есть message() или cat() .

То, что я пробовал:

  1. Я заметил, что readline() по-прежнему будет хранить пустую строку символов (""), несмотря на полный выход из функция (то есть нажатие клавиши «es c», когда Type: появляется в следующем коде:
> ans <- readline("Type: ")
Type:

> ans
[1] ""
Когда readline() обернут в функцию, тогда я могу добиться такого же поведения и вернуть вывод (снова, нажав «es c», когда появляется Type:):
fun <- function()
{
  ans <- readline("Type: ")

  if(ans == "")
  {
    return("STOP")
  }else{
    return(ans)
  }
}

> ans <- fun()
Type: 

> ans
[1] "STOP"
Когда эта функция является подпрограммой для другой функции (например, основной функции), объект, который выводится из подпрограммы, может использоваться для возврата списка результатов (нажмите 'es c' когда Type: появляется):
alt.fun <- function()
{
  object <- fun()

  if(is.character(object))
  {
    res <- list()
    res$one <- "one"
    res$two <- "two"
    res$three <- "three"

    return(res)

  }else{
    print("Continue to do other things")
  }
}

> result <- alt.fun()
Type: 

> result
$one
[1] "one"

$two
[1] "two"

$three
[1] "three"
Однако при вставке сообщения пользователю функция ничего не возвращает (нажмите «es c» при появлении Type:):
main.fun <- function()
{
  object <- fun()

  if(is.character(object))
  {
    message("User stopped. Results up to this point have been saved.")

    res <- list()
    res$one <- "one"
    res$two <- "two"
    res$three <- "three"

    return(res)

  }else{
    print("Continue to do other things")
  }
}

> result_two <- main.fun()
Type: 

> result_two
Error: object 'result_two' not found

Решение I ' Я бы предпочел: В конечном счете, я хотел бы, чтобы решение № 4 в том, что я пробовал. Более конкретно, я хотел бы напечатать пользователю сообщение, чтобы сообщить им, что они остановили функцию и что их результаты сохранены. И тогда я бы хотел, чтобы их результаты были действительно сохранены и возвращены им.

1 Ответ

0 голосов
/ 15 апреля 2020

Обходной путь, который я предложил, состоит в том, чтобы уведомить пользователя о том, что когда он нажимает 'es c', его результаты будут сохранены:

fun <- function()
{
  message("Press 'esc' to stop (results will be saved).")

  ans <- readline("Type: ")

  if(ans == "")
  {
    return("STOP")
  }else{
    return(ans)
  }
}

main.fun <- function()
{
  object <- fun()

  if(is.character(object))
  {
    res <- list()
    res$one <- "one"
    res$two <- "two"
    res$three <- "three"

    return(res)

  }else{
    print("Continue to do other things")
  }
}

> result_two <- main.fun()
Press 'esc' to stop (results will be saved).
Type: 

> result_two
$one
[1] "one"

$two
[1] "two"

$three
[1] "three"

Для моей цели это не оптимально, потому что сообщение печатается каждый раз, когда появляется функция readline().

...