Как я могу получить доступ к аргументам функции в декораторе для этой функции? - PullRequest
1 голос
/ 16 октября 2019

Я хочу написать декоратор, чтобы легко печатать тип всех аргументов, которые были переданы функции в R.

Пока мне удалось написать код, который делает это для меня, но я хочу избежатьскопируйте его и вставьте в требуемые функции.

    fun <- function(...){
        c = as.list(match.call())
        d= lapply(c, print(typeof))
        print(d)}

Печатается ожидаемый результат. Теперь я хочу встроить это поведение в декоратор, но не могу получить доступ к аргументам функции внутри декоратора.

    print_arguments <- function(f){
        function(...){
        arguments_of_f = ???
        d= lapply(arguments_of_f, print(typeof))
        print(d)
        return(f(...))
        }
    }

Как мне получить аргументы f в этом случае?

Спасибо за помощь!

1 Ответ

2 голосов
/ 16 октября 2019

Не совсем уверен, почему вы используете match.call. Самый простой способ получить аргументы - использовать list(...). Это вы также можете использовать в вашем декораторе:

print_arguments <- function(f){
  function(...){
    d <- sapply(list(...), typeof)
    print(d)
    return(f(...))
  }
}

Я использую sapply вместо lapply, поскольку выходные данные могут быть легко преобразованы в вектор, и это дает более чистый вывод.

Вывод:

> foo <- print_arguments(plot)
> foo(iris, pch = 20)
              pch 
  "list" "double" 

Примечание

Как отмечено @MrFlick, это не работает, когда декорированная функция использует нестандартную оценку аргумента,Например:

> subset_deco <- print_arguments(subset)
> subset_deco(iris, Sepal.Length > 1)
 Error in lapply(X = X, FUN = FUN, ...) : object 'Sepal.Length' not found 
...