¿Cómo obtener el nombre de la función de llamada dentro de la rutina llamada?

¿Existe una forma "no interna" de obtener el nombre de la persona que llama, ya que la funciónstop ¿hace?

La idea es que tengo una pequeña función que verifica las entradas y detiene la ejecución si no se cumple alguna condición. Esta función es llamada por varios otros, que utilizan el mismo código de validación. Si la entrada no es válida, el entorno de la persona que llama es volcado (para que pueda ver los argumentos pasados ​​a la función), y la ejecución se detiene.

Ejemplo simplificado:

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

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

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

Pensé que evaluar la expresión.quote(stop("blah")) en el entorno de la persona que llama haría que muestre el nombre de la persona que llama. Sin embargo, el resultado es el siguiente:

test(-1, 2)

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

Y esto no cambia si lo uso.parent.frame(n) conn>1 enevalq.

Entonces, aquí está la pregunta, en realidad dos preguntas: 1. ¿Hay alguna forma de obtener el nombre de la función que creó un entorno (asumiendo que se creó como tal)? 2. ¿Por qué falla la solución anterior?

EDITAR: dije que la solución anterior falla porque quería que el mensaje de error aparezca como

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

como si elstop declaración fue parte detest cuerpo. Entonces, la pregunta 2 se puede replantear como: 2 ': ¿Por qué la evaluación destop("invalid input.") capturar el nombre de la persona que llama, considerando que se evaluó en el entorno de la persona que llama?

Respuestas a la pregunta(5)

Su respuesta a la pregunta