Есть ли способ "не внутреннего" для получения имени вызывающего абонента, как это делает функция stop
?
Идея заключается в том, что у меня есть небольшая функция, которая проверяет входные данные и останавливает выполнение, если какое-либо условие не выполняется. Эта функция вызывается несколькими другими, которые используют один и тот же код проверки. Если вход недействителен, среда вызывающего объекта сбрасывается (поэтому я могу видеть аргументы, переданные функции), и выполнение останавливается.
Упрощенный пример:
check <- function(x)
{
if(x<0)
{
print(as.list(parent.frame()))
evalq(stop("invalid input."), parent.frame())
}
}
test <- function(x, y)
{
check(x)
}
Я думал, что оценка выражения quote(stop("blah"))
в среде вызывающего абонента заставит его показать имя вызывающего абонента. Однако в результате получается следующее:
test(-1, 2)
# $x
# [1] -1
#
# $y
# [1] 2
#
# Error in eval(substitute(expr), envir, enclos) : invalid input.
И это не изменится, если я использую parent.frame(n)
с n>1
в evalq
.
Итак, вот вопрос, на самом деле два вопроса: 1. Есть ли способ получить имя функции, создавшей среду (предполагая, что она была создана как таковая)? 2. Почему обходной путь выше не удается?
EDIT: Я сказал, что обходной путь выше не работает, потому что я хотел, чтобы сообщение об ошибке отображалось как
Error in test(x, y) : invalid input.
как будто оператор stop
был частью тела test
. Таким образом, вопрос 2 можно пересчитать как: 2 ': Почему оценка stop("invalid input.")
не захватила имя вызывающего абонента, учитывая, что она была оценена в среде вызывающего?