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?