我想整合一个具有向量fun_integrate
的函数vec
作为输入参数:
fun_integrate <- function(x, vec) {
y <- sum(x > vec)
dnorm(x) + y
}
#Works like a charm
fun_integrate(0, rnorm(100))
integrate(fun_integrate, upper = 3, lower = -3, vec = rnorm(100))
300.9973 with absolute error < 9.3e-07
Warning message:
In x > vec :
longer object length is not a multiple of shorter object length
据我所知,问题如下:integrate
调用fun_integrate
为x
的向量,它根据upper
和{{1}进行计算}}。这个向量化调用似乎不适用于作为附加参数传递的另一个向量。我想要的是lower
为内部计算的每个integrate
调用fun_integrate
,并将该单x
与向量x
进行比较,我就是{m}非常确定我的上述代码不会这样做。
我知道我自己可以实现集成例程,即在vec
和lower
之间计算节点,并分别评估每个节点上的函数。但这不是我的首选解决方案。
另请注意,我检查了upper
,但这似乎适用于另一个问题,即函数不接受Vectorize
的向量。我的问题是我想要一个额外的矢量作为参数。
答案 0 :(得分:3)
integrate(Vectorize(fun_integrate,vectorize.args='x'), upper = 3, lower = -3, vec = rnorm(100),subdivisions=10000)
304.2768 with absolute error < 0.013
#testing with an easier function
test<-function(x,y) {
sum(x-y)
}
test(1,c(0,0))
[1] 2
test(1:5,c(0,0))
[1] 15
Warning message:
In x - y :
longer object length is not a multiple of shorter object length
Vectorize(test,vectorize.args='x')(1:5,c(0,0))
[1] 2 4 6 8 10
#with y=c(0,0) this is f(x)=2x and the integral easy to solve
integrate(Vectorize(test,vectorize.args='x'),1,2,y=c(0,0))
3 with absolute error < 3.3e-14 #which is correct
答案 1 :(得分:2)
罗兰的回答看起来不错。只是想指出它是sum
,而不是integrate
抛出警告信息。
Rgames> xf <- 1:10
Rgames> vf <- 4:20
Rgames> sum(xf>vf)
[1] 0
Warning message:
In xf > vf :
longer object length is not a multiple of shorter object length
您得到的答案不正确的事实表明integrate
没有向您的函数发送您期望的x向量。