在R中的函数参数中评估(...)

时间:2017-05-17 09:10:00

标签: r function

我有以下功能:

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函数会发生什么?

1 个答案:

答案 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返回的是函数而不是值

(...)匹配传递的所有其他参数