乘以两个函数

Bio*_*roo 4 r function

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

我想尝试类似的东西:

f<-function(x){x+2}
g<-function(x){x}
Run Code Online (Sandbox Code Playgroud)

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

Spa*_*man 11

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

Multiply=function(a,b){
  force(a)
  force(b)
  function(x){a(x)*b(x)}
}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

 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
Run Code Online (Sandbox Code Playgroud)

然后:

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
Run Code Online (Sandbox Code Playgroud)

你可以使用任何功能:

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
Run Code Online (Sandbox Code Playgroud)

使用该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
Run Code Online (Sandbox Code Playgroud)

请注意,它始终是圆括号(括号),因为它们仍然是函数.它们碰巧是由其他功能创建的.

还要注意使用forceMultiply功能-这是因为这些论点ab没有进行评估时,Multiply函数被调用-当返回的函数被调用他们只得到评估.如果任一f或者g被更改或删除之前h被调用,则没有force那么h将获得的价值f,并g在当时h被调用,而不是一次被定义.这可能导致一些令人生气的难以发现的错误.