有没有人知道如何在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)
请注意,它始终是圆括号(括号),因为它们仍然是函数.它们碰巧是由其他功能创建的.
还要注意使用force的Multiply功能-这是因为这些论点a并b没有进行评估时,Multiply函数被调用-当返回的函数被调用他们只得到评估.如果任一f或者g被更改或删除之前h被调用,则没有force那么h将获得的价值f,并g在当时h被调用,而不是一次被定义.这可能导致一些令人生气的难以发现的错误.