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