如何在R中装饰函数?

如何在R中装饰函数?,r,metaprogramming,decorator,R,Metaprogramming,Decorator,我试图在R中插入一些函数,用我自己的版本替换它们,这些版本记录一些信息,然后调用原始版本。我的问题是,如何构造调用,使其完全复制原始参数 首先,我们将建立一个环境 env <- new.env() 然后,如果我们做得对,我们可以在我们构建的环境中计算使用[的某个表达式,我们的插入指令的函数将被调用: ## Should return data.frame(b = c(4, 5, 6)) evalq( data.frame(a = c(1, 2, 3), b = c(4, 5

我试图在R中插入一些函数,用我自己的版本替换它们,这些版本记录一些信息,然后调用原始版本。我的问题是,如何构造调用,使其完全复制原始参数

首先,我们将建立一个环境

   env <- new.env()
然后,如果我们做得对,我们可以在我们构建的环境中计算使用
[
的某个表达式,我们的插入指令的函数将被调用:

## Should return data.frame(b = c(4, 5, 6))
evalq(
    data.frame(a = c(1, 2, 3), b = c(4, 5, 6))[, "b"],
    envir = env
)

有人能提供帮助/建议吗?

难道你不能用三点arg捕捉原始函数arg的所有内容,并将其传递给原始函数吗

sum <- function(..., na.rm = TRUE) {
  print("my sum") # here is where you can "record some info"
  base::sum(..., na.rm = na.rm) # then call original function w/ ...
}

base::sum(5,5, NA)
##[1] NA

# your function
sum(5,5, NA)
##[1] "my sum"
##[1] 10

sum难道不能用三个点arg捕获原始函数arg的所有内容,并将其传递给原始函数吗

sum <- function(..., na.rm = TRUE) {
  print("my sum") # here is where you can "record some info"
  base::sum(..., na.rm = na.rm) # then call original function w/ ...
}

base::sum(5,5, NA)
##[1] NA

# your function
sum(5,5, NA)
##[1] "my sum"
##[1] 10

sum使用
trace

trace(`[.data.frame`, quote({print("hello!")}), at = 1) 
iris[1,]
#Tracing `[.data.frame`(iris, 1, ) step 1 
#[1] "hello!"
#  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#1          5.1         3.5          1.4         0.2  setosa

使用
跟踪

trace(`[.data.frame`, quote({print("hello!")}), at = 1) 
iris[1,]
#Tracing `[.data.frame`(iris, 1, ) step 1 
#[1] "hello!"
#  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#1          5.1         3.5          1.4         0.2  setosa

可能相关:我倾向于修复一些默认值,大致如下:假设我希望
table
始终包含缺少的值,那么在我的脚本开始时,我使用
table,你能更清楚地解释你想要实现什么吗?如果我理解正确,你要么想为
[
或想用自己的函数替换
[
。但是,你的函数名让我很困惑。现在你把这一点弄得更糊涂了。你给环境分配了一个函数。为什么?我真的建议你走另一条路。创建一个S3类并为
定义一个方法[
。可能相关:我倾向于按照以下思路修复一些默认值:假设我希望
table
始终包含缺少的值,那么在我的脚本开始时,我使用
table,你能更清楚地解释一下你想要实现什么吗?如果我理解正确,你要么想为编写一个方法e> [
或想用自己的函数替换
[
。但是,你的函数名让我很困惑。现在你把这一点弄得更糊涂了。你给环境分配了一个函数。为什么?我真的建议你走另一条路。创建一个S3类并为
[
定义一个方法。