如何在R中装饰函数?
我试图在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
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类并为[
定义一个方法。