我想在R中集成一个涉及while循环的函数,我已经在这里粘贴了一个MWE。有没有人可以指导一下,在集成这样的功能时,如何摆脱警告消息?
谢谢
myfun <- function(X, a, b, kmin, kmax){
term <- 0
k <- 1
while(k < kmax | term < 10000){
term <- term + a * b * X^k
k <- k+1
}
fx <- exp(X) * term
return(fx)
}
a <- 5
b <- 4
kmax <- 20
integrate(myfun, lower = 0, upper = 10, a = a, b = b, kmax = kmax)
生成可通过warnings()
访问的警告
In while (k < kmax | term < 10000) { ... :
the condition has length > 1 and only the first element will be used
发布于 2020-07-19 03:49:05
从integrate()
文档中:
f
必须接受输入向量,并在这些点处生成函数求值向量。
这就是问题的症结所在,您可以通过运行myfun(c(1, 2), a, b, kmin, kmax)
并重现类似的警告来看到这一点。实际情况是,integrate()
希望将输入向量传递给X
中的myfun
;这意味着在while
循环中,term
也将成为一个向量。当while
循环返回到计算阶段时,这会产生一个问题,因为现在条件k < kmax | term < 10000
也有一个向量结构(因为term
有),这是while
不喜欢的。
在这种情况下,这个警告非常有用,因为它强烈地表明integrate()
没有做您想让它做的事情。这里的目标不是消除警告消息;由于while
循环结构的原因,编写的函数不能与integrate()
一起工作。
您可以选择(1)以不使用while
循环的方式重写函数,或者(2)自己硬编码一些数值积分,可能是使用for
循环。使用R的最好方法是将所有内容矢量化,并尽可能避免使用while
和for
之类的东西。
最后,我将注意到底层函数似乎有一些问题,因为myfun(0.5, a, b, kmin, kmax)
不收敛(请注意当提供的X项小于1时的数学问题),因此无论您做什么,您都无法在区间0,10上对其进行积分。
https://stackoverflow.com/questions/62975716
复制