如何在装饰器中访问该函数的参数?

时间:2019-10-16 14:21:07

标签: r decorator

我想编写一个装饰器,以轻松打印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 个答案:

答案 0 :(得分:2)

不完全确定为什么使用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