在 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 &lt; kmax | term &lt; 10000 也具有向量结构(因为term 有),而while 不喜欢这种结构。

这个警告在这种情况下非常好,因为它强烈表明integrate() 没有做你想让它做的事情。您的目标不是消除警告消息;由于while 循环结构,所编写的函数根本不适用于integrate()

您可以选择 (1) 以不使用 while 循环的方式重写函数,或者 (2) 自己硬编码一些数字积分,可能使用 @987654337 @ 环形。使用 R 的最佳方式是将所有内容矢量化,并尽可能避免使用 whilefor 之类的内容。

最后,我会注意到底层函数似乎存在一些问题,因为myfun(0.5, a, b, kmin, kmax) 不会收敛(请注意,当提供的 X 项小于 1 时存在数学问题),所以你不会无论你做什么,都无法在区间 [0, 10] 上积分。

【讨论】:

亲爱的亚伦。你是绝对正确的。请问有什么可以替代while循环? 我们或许可以在不使用 while 循环的情况下重写该函数,但在我们这样做之前:该函数真的是您想要的吗?就像我之前提到的,X

以上是关于在 R 中将函数与 while 循环集成的主要内容,如果未能解决你的问题,请参考以下文章

在 Win32Proj 中将 Qt 与 Visual Studio (C++) 集成

在 ABP 中将 roxyfileman 与 tinymce 集成时有啥问题

R中的for循环与while循环

如何在 django 管理中将多个图像上传与 UPLOADIFY 集成?

如何在android中将离线字典与pdf阅读器集成

在 React Native 应用程序中将 Relay 与 Redux 集成