我想编写一个装饰器,以轻松打印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的参数?
感谢您的帮助!
答案 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