Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何在函数的装饰器中访问函数的参数?_R_Decorator - Fatal编程技术网

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

R 如何在函数的装饰器中访问函数的参数?,r,decorator,R,Decorator,我想编写一个decorator来轻松打印在R中给定给函数的所有参数的类型 到目前为止,我成功地为自己编写了这样的代码,但我希望避免将其复制粘贴到所需的函数中 fun <- function(...){ c = as.list(match.call()) d= lapply(c, print(typeof)) print(d)} fun不完全确定为什么要使用match.call。获取参数的最简单方法是使用list(…)。这也可以在装饰

我想编写一个decorator来轻松打印在R中给定给函数的所有参数的类型

到目前为止,我成功地为自己编写了这样的代码,但我希望避免将其复制粘贴到所需的函数中

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

fun不完全确定为什么要使用
match.call
。获取参数的最简单方法是使用
list(…)
。这也可以在装饰器中使用:

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

正如@MrFlick所指出的,当修饰函数使用非标准参数求值时,这不起作用。例如:

> subset_deco <- print_arguments(subset)
> subset_deco(iris, Sepal.Length > 1)
 Error in lapply(X = X, FUN = FUN, ...) : object 'Sepal.Length' not found 
>subset_deco subset_deco(鸢尾,萼片长度>1)
lappy中出错(X=X,FUN=FUN,…):找不到对象“sepa.Length”

如果函数依赖于非标准评估,这将导致一些问题。例如
subset(mtcars,cyl==6)
工作得很好,但是
foo我使用了match.call,因为这是我找到的第一种获取函数参数的方法。“…”是获取它所在函数的参数的短方法,对吗?我找不到任何文档,也不知道如何查找。谢谢你的回答!今天晚些时候我会试试。@flick先生,你说得对。要让这项工作发挥作用将是一个相当大的挑战;我真的看不到解决办法。我会考虑一下,同时给我的答案加上一个警告。这个解决方案似乎对我不起作用。我使用的Testfunction很有趣
> foo <- print_arguments(plot)
> foo(iris, pch = 20)
              pch 
  "list" "double" 
> subset_deco <- print_arguments(subset)
> subset_deco(iris, Sepal.Length > 1)
 Error in lapply(X = X, FUN = FUN, ...) : object 'Sepal.Length' not found