pobieranie argumentów funkcji nadrzędnej w R z nazwami

Próbuję napisać funkcję, która przechwytuje argumenty funkcji, z której jest wywoływana. Na przykład,

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 () niestety nie dodaje nazw parametrów dopasowania z wartościami argumentów i chciałbym napisać podobną wersję get_args, która zwraca wynik podobny do

caller2 <- function (x, y, z) {
    as.list( match.call() )[-1]
}
caller2(1,2,3)

$x
[1] 1

$y
[1] 2

$z
[1] 3

zastąpienie "get_args ()" przez "match.call ()" bezpośrednio nie jest rozwiązaniem, którego szukam, ponieważ w rzeczywistości get_args zrobi kilka innych rzeczy przed zwróceniem argumentów funkcji nadrzędnych.

Próbowałem użyć match.call () z sys.parent () na kilka sposobów, ale nie mogę uzyskać funkcji zwracającej argumenty wywołującego; po prostu zwraca argumenty get_args ().

Czy jest jakiś sposób, aby wynik powrotu get_args () był identyczny z wyjściem caller2 dla powyższego przypadku testowego? Wiem, że ręczne nazywanie argumentów jest możliwe przy użyciu formals (), ale czy jest to gwarantowane jako równoważne?

Jeśli potrzebne są jakiekolwiek wyjaśnienia, zostaw komentarz poniżej. Dzięki.

EDYTUJ 1:

celem get_args () jest działanie jako przyjazny dla użytkownika sposób pobierania argumentów, z którymi wywołano funkcję. Wpisywanie as.list (match.call ()) [- 1] się starzeje, ale ponieważ match.call pobiera najbliższe wywołanie funkcji, po prostu otrzymuje argumenty get_args () w tej chwili.

get_args () otrzyma również domyślne argumenty z funkcji nadrzędnej, ale to łatwe do zaimplementowania.

ROZWIĄZANIE:

dzięki Hong Ooi kluczem do używania match.call wydaje się być zarówno połączeniei definicja funkcji, o której chcesz się dowiedzieć. Nieco zmodyfikowana, przyjazna anonimowo wersja get_args jest poniżej dla potomności

get_args <- function () {
as.list( match.call(
    def = sys.function( -1 ),
    call = sys.call(-1)) )[-1]

}

Ta wersja wyszukuje funkcję dalej stosu wywołań, pobiera jego definicję i wywołanie oraz dopasowuje parametry do jego argumentów.

questionAnswers(1)

yourAnswerToTheQuestion