Como obter o nome da função de chamada dentro da rotina chamada?

Existe uma maneira "não-interna" para obter o nome do chamador, como a funçãostop faz?

A idéia é que eu tenho uma pequena função que verifica as entradas e interrompe a execução se alguma condição não for atendida. Essa função é chamada por vários outros que usam o mesmo código de validação. Se a entrada for inválida, o ambiente do chamador será descartado (para que eu possa ver os argumentos passados ​​para a função) e a execução seja interrompida.

Exemplo simplificado:

check <- function(x)
{
    if(x<0)
    {
        print(as.list(parent.frame()))

        evalq(stop("invalid input."), parent.frame())
    }
}

test <- function(x, y)
{
    check(x)
}

Eu pensei que avaliar a expressãoquote(stop("blah")) no ambiente do chamador, ele mostraria o nome do chamador. No entanto, o resultado é o seguinte:

test(-1, 2)

# $x
# [1] -1
# 
# $y
# [1] 2
# 
# Error in eval(substitute(expr), envir, enclos) : invalid input.

E isso não muda se eu usarparent.frame(n) comn>1 emevalq.

Então, aqui está a pergunta, na verdade, duas questões: 1. Existe uma maneira de obter o nome da função que criou um ambiente (supondo que ele tenha sido criado como tal)? 2. Por que a solução alternativa acima falha?

EDIT: eu disse que a solução acima falha porque eu queria que a mensagem de erro para aparecer como

Error in test(x, y) : invalid input.

como se ostop declaração eram uma parte detest corpo. Então a questão 2 pode ser reafirmada como: 2 ': Por que a avaliação destop("invalid input.") capturar o nome do chamador, considerando que foi avaliado no ambiente do chamador?

questionAnswers(5)

yourAnswerToTheQuestion