我有以下功能:
ignore <- function(...) NULL
tee <- function(f, on_input = ignore, on_output = ignore) {
function(...) {
on_input(...)
output <- f(...)
on_output(output)
output
}
}
我的问题是如何在tee函数的on_input中评估(...)表达式?我理解,在ignore函数的情况下,它将只接受任何参数并仍然返回NULL值。但是,我不确定on_input和on_output是否是函数,以及在这种情况下on_input和output函数会发生什么?
答案 0 :(得分:1)
您从Wickham Book Advanced R.那里获取了该代码。 在本书中,您可以找到一个示例
g <- function(x) cos(x) - x
zero <- uniroot(g, c(-5, 5))
show_x <- function(x, ...) cat(sprintf("%+.08f", x), "\n")
# The location where the function is evaluated:
zero <- uniroot(tee(g, on_input = show_x), c(-5, 5))
您可以想象on_input和on_output是与函数的输入和输出一起使用的函数。 例如,在这种情况下,您将在g函数上打印每次迭代的输入。
zero <- uniroot(tee(g, on_output = show_x), c(-5, 5))
相反,在这种情况下,您将在每次迭代时打印函数的输出。
总结一下,是on_input和on_output是函数,这个函数只适用于函数f的输入和输出。
修改
了解正在发生的事情只是一个更简单的例子
pow2<-function(x){x^2}
input<-function(x){
cat(paste("input is ",x,"\n",sep=""))
}
output<-function(x){
cat(paste("output is ",x,"\n",sep=""))
}
tee(pow2,on_input=input,on_output=output)(2)
input is 2
output is 4
[1] 4
这里的主要功能显然是pow2
采取pow2并返回运行on_input,pow2和on_output的函数。
另请注意,您必须调用并将参数传递给tee的结果,实际上tee返回的是函数而不是值
(...)匹配传递的所有其他参数