在 R 中将函数与 while 循环集成
Posted
技术标签:
【中文标题】在 R 中将函数与 while 循环集成【英文标题】:Integration of a function with while loop in R 【发布时间】:2020-11-08 13:02:39 【问题描述】:我想在 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
【问题讨论】:
请阅读***.com/editing-help。值得注意的是,代码围栏是三个反引号 (```
),而不是三个单引号 ('''
)。
【参考方案1】:
来自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) 自己硬编码一些数字积分,可能使用 @987654337 @ 环形。使用 R 的最佳方式是将所有内容矢量化,并尽可能避免使用 while
和 for
之类的内容。
最后,我会注意到底层函数似乎存在一些问题,因为myfun(0.5, a, b, kmin, kmax)
不会收敛(请注意,当提供的 X 项小于 1 时存在数学问题),所以你不会无论你做什么,都无法在区间 [0, 10] 上积分。
【讨论】:
亲爱的亚伦。你是绝对正确的。请问有什么可以替代while循环? 我们或许可以在不使用 while 循环的情况下重写该函数,但在我们这样做之前:该函数真的是您想要的吗?就像我之前提到的,X以上是关于在 R 中将函数与 while 循环集成的主要内容,如果未能解决你的问题,请参考以下文章
在 Win32Proj 中将 Qt 与 Visual Studio (C++) 集成
在 ABP 中将 roxyfileman 与 tinymce 集成时有啥问题