乘以两个函数

时间:2013-12-29 07:59:06

标签: r function

有人知道如何在R中的两个数学函数中乘法或执行任何二元运算吗?

我正试图采取类似的措施:

f<-function(x){x+2}
g<-function(x){x}

我希望h = f * g,最终整合h。我需要做很多次这样的事情,所以手动输入h不是一个可行的选择。

1 个答案:

答案 0 :(得分:11)

如果要创建大量乘法函数,请创建一个乘数函数,该函数返回一个函数,该函数是其函数参数的乘积:

Multiply=function(a,b){
  force(a)
  force(b)
  function(x){a(x)*b(x)}
}

然后你可以这样做:

 f<-function(x){x+2}
 g<-function(x){x}
 h=Multiply(f,g)
 h(1:5)
[1]  3  8 15 24 35
 f(1:5)*g(1:5)
[1]  3  8 15 24 35

然后:

h2=Multiply(f,f)
h2(1:5)
[1]  9 16 25 36 49
f(1:5)*f(1:5)
[1]  9 16 25 36 49

你可以在任何函数中使用它:

h3 = Multiply(sqrt,sin)
h3(1:5)
[1]  0.841471  1.285941  0.244427 -1.513605 -2.144220
sqrt(1:5)*sin(1:5)
[1]  0.841471  1.285941  0.244427 -1.513605 -2.144220

使用Multiply函数创建的任何函数都将是一个函数,它返回两个函数的元素乘积。

使用这样的函数进行编程通常非常有用。有一个R包functional,它有一些这类功能,包括Compose,就像你的情况一样,但构造f(g(x))而不是f(x)*g(x)

require(functional)
z=Compose(sqrt,sin)
z(1:5)
[1] 0.8414710 0.9877659 0.9870266 0.9092974 0.7867491
sin(sqrt(1:5))
[1] 0.8414710 0.9877659 0.9870266 0.9092974 0.7867491

请注意,它始终是圆括号(括号),因为它们仍然是函数。它们恰好是由其他函数创建的。

另请注意force函数中Multiply的使用 - 这是因为a函数不会评估参数bMultiply被调用 - 只有在调用返回的函数时才会对它们进行求值。如果在调用f之前更改或删除了gh,则在没有force的情况下,h将获得f的值调用时g的{​​{1}},而不是它的定义时间。这可能导致一些令人生气的难以发现的错误。