有人知道如何在R中的两个数学函数中乘法或执行任何二元运算吗?
我正试图采取类似的措施:
f<-function(x){x+2}
g<-function(x){x}
我希望h = f * g
,最终整合h
。我需要做很多次这样的事情,所以手动输入h
不是一个可行的选择。
答案 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
函数不会评估参数b
和Multiply
被调用 - 只有在调用返回的函数时才会对它们进行求值。如果在调用f
之前更改或删除了g
或h
,则在没有force
的情况下,h
将获得f
的值调用时g
的{{1}},而不是它的定义时间。这可能导致一些令人生气的难以发现的错误。