obtendo os argumentos de uma função pai em R, com nomes
Estou tentando escrever uma função que captura os argumentos da função da qual é chamada. Por exemplo,
get_args <- function () as.list( sys.call(sys.parent()) )[-1]
caller <- function (x, y, z) {
get_args()
}
caller(1,2,3)
[[1]]
[1] 1
[[2]]
[1] 2
[[3]]
[1] 3
sys.call () infelizmente não adiciona nomes de parâmetros de correspondência com valores de argumento, e eu gostaria de escrever uma versão similar de get_args que retorne uma saída semelhante a
caller2 <- function (x, y, z) {
as.list( match.call() )[-1]
}
caller2(1,2,3)
$x
[1] 1
$y
[1] 2
$z
[1] 3
substituir "get_args ()" por "match.call ()" diretamente não é a solução que estou procurando, pois, na realidade, get_args fará algumas outras coisas antes de retornar seus argumentos de funções pai.
Eu tentei usar match.call () com sys.parent () de várias maneiras, mas não consigo obter a função para retornar os argumentos do chamador; apenas retorna os argumentos de get_args ().
Existe alguma maneira de tornar a saída de retorno get_args () idêntica àquela do caller2 para o caso de teste acima? Eu sei que nomear os argumentos manualmente é possível usando formals (), mas isso é garantido para ser equivalente?
Se algum esclarecimento for necessário, deixe um comentário abaixo. Obrigado.
EDIT 1:
o objetivo de get_args () é agir como uma maneira amigável de obter os argumentos com os quais uma função foi chamada. Digitar as.list (match.call ()) [- 1] fica antigo, mas como match.call pega a chamada de função mais próxima, ele recebe os argumentos de get_args () no momento.
get_args () também irá receber argumentos padrão da função pai, mas isso é fácil de implementar.
SOLUÇÃO:
obrigado Hong Ooi, a chave para usar match.call parece estar fornecendo tanto a chamadae a definição da função que você deseja descobrir. Uma versão ligeiramente modificada e anônima do get_args está abaixo para a posteridade
get_args <- function () {
as.list( match.call(
def = sys.function( -1 ),
call = sys.call(-1)) )[-1]
}
Esta versão encontra a função mais acima na pilha de chamadas, pega sua definição e chama, e combina parâmetros com seus argumentos.