r - 函数返回 NaN
问题描述
我不明白为什么下面的函数会返回 NaN,即使答案不应该是 NaN。我试图搜索类似的问题,但其中大多数是我无法理解的其他编程语言。
代码:
a0 = 1.5; a1 = 0.4; b1 = 0.3; g1= 0.7
nu = rep(0,1)
h.new = rep(0,1)
ddp = rep(0,1)
nu[1]=0
h.new[1] = a0/(1-a1-b1)
ddp[1] = 0.5*log(g1)- g1*h.new[1] +
nu[1]*(log(nu[1])-1) - log(factorial(nu[1]))+(g1)*nu[1]*
(1+log(h.new[1]/nu[1]))
这是输出:
###> ddp
###[1] NaN
然后我手动计算,明确表明ddp不是NaN:
###h.new = 1.5/(1-0.4-0.3) = 5
###ddp
###= 0.5*log(0.7)- (0.7)*(5) +
###(0)*(log(0)-1) - log(0!)+(0.7)*(0)*
###(1+log(5/0))
###= 0.5*log(0.7)- (0.7)*(5)
###= -3.6783
我确实知道 sum() 函数,na.rm=TRUE 可以省略所有缺失值,但在这种情况下,如何修改代码使其返回正确答案?
提前致谢。
解决方案
通常在 R 中0*Inf
给出NaN
:计算机不/不知道你想如何接受限制。如果您知道希望这些限制为零,则可以指定计算在特殊情况下的工作方式nu==0
:
term3 <- if (nu==0) 0 else nu*(log(nu)-1)
term5 <- if (nu==0) 0 else g1*nu*(1+log(h.new/nu))
ddp = 0.5*log(g1)-
g1*h.new +
term3 -
log(factorial(nu))+
term5
zprod
你可以用一个函数稍微更一般地做到这一点:
zprod <- function(x,y) {
if (x==0) 0 else x*y
}
ddp = 0.5*log(g1)- g1*h.new +
zprod(nu,log(nu)-1) - log(factorial(nu))+
g1*zprod(nu,1+log(h.new/nu))
推荐阅读
- javascript - Webpack CSS Module Error 如何正确加载css
- c++ - 如何传递 matlab::data::TypedArray
作为在 MATLAB mex 文件中构造犰狳矩阵的指针? - unix - 在不同的行上使用带有条件的 awk
- x11 - ffplay over X11 在 Ubuntu 系统上抛出 BadRequest GLX 错误
- javascript - 还原 | 为什么这个 Redux 的 state 参数没有被更新?
- scala - 用于 Function2 和 Function3 特征的 LUB
- python - Pandas DataFrame:按类型过滤列/索引
- vue.js - Vue3 高阶处理程序失败
- javascript - 我如何在页面加载时滚动到特定的 div
- python - 在 Windows 上安装 python selenium 包时遇到问题