получение аргументов родительской функции в R с именами
Я пытаюсь написать функцию, которая фиксирует аргументы функции, из которой она вызывается. Например,
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 () не добавляет имена параметров соответствия со значениями аргументов, и я хотел бы написать аналогичную версию get_args, которая возвращает вывод, аналогичный
caller2 <- function (x, y, z) {
as.list( match.call() )[-1]
}
caller2(1,2,3)
$x
[1] 1
$y
[1] 2
$z
[1] 3
Замена "get_args ()" на "match.call ()" напрямую не является решением, которое я ищу, поскольку в действительности get_args будет делать некоторые другие вещи перед возвратом аргументов своих родительских функций.
Я пытался использовать match.call () с sys.parent () несколькими способами, но не могу заставить функцию возвращать аргументы вызывающей стороны; он просто возвращает аргументы get_args ().
Есть ли способ сделать так, чтобы get_args () возвращал выходные данные, идентичные таковым для caller2 для приведенного выше теста? Я знаю, что именование аргументов вручную возможно с использованием formals (), но гарантированно ли это равнозначно?
Если требуется какое-либо разъяснение, оставьте комментарий ниже. Благодарю.
РЕДАКТИРОВАТЬ 1:
Цель get_args () - действовать как удобный способ получения аргументов, с которыми была вызвана функция. Тип as.list (match.call ()) [- 1] устареет, но поскольку match.call перехватывает ближайший вызов функции, он просто получает аргументы get_args () в данный момент.
get_args () также получит аргументы по умолчанию от родительской функции, но это легко реализовать.
РЕШЕНИЕ:
спасибо Hong Ooi, ключ к использованию match.call, кажется, обеспечивает оба вызоваа также определение функции, о которой вы хотите узнать. Немного измененная, анонимно-дружественная версия get_args ниже для потомков
get_args <- function () {
as.list( match.call(
def = sys.function( -1 ),
call = sys.call(-1)) )[-1]
}
Эта версия находит функцию дальше по стеку вызовов, захватывает ее определение и вызов и сопоставляет параметры с ее аргументами.