Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 函数返回NaN_R - Fatal编程技术网

R 函数返回NaN

R 函数返回NaN,r,R,我不明白为什么下面的函数返回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

我不明白为什么下面的函数返回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可以删除所有缺少的值, 但在这种情况下,如何修改代码使其返回正确答案


提前感谢。

通常
0*Inf
在R中给出
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

一般来说,
0*Inf
在R中给出
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

nu[1]
为0,0的日志未定义。R将日志(0)计算为
-Inf
然后你有了日志(5/0)-什么是5/0?没有定义。因此,您有许多未定义的值,这些值将创建一个整体未定义的结果。正如Ben在回答中所指出的,当您将0乘以
Inf
-Inf


但是,即使这两个元素解析为0,您编写的代码的计算结果也将是-3.68,而不是-0.52。因此,您手工做了一些错误。

nu[1]
为0,0的日志未定义。R将日志(0)计算为
-Inf
然后你有了日志(5/0)-什么是5/0?没有定义。因此,您有许多未定义的值,这些值将创建一个整体未定义的结果。正如Ben在回答中所指出的,当您将0乘以
Inf
-Inf


但是,即使这两个元素解析为0,您编写的代码的计算结果也将是-3.68,而不是-0.52。那么,你手工做了一些错误的事情。

为什么你要尝试使用
log(0)
,或者
5/0
?hi@user2357112,给定的数据(nu[1])是0,在整个数据集中,有些数据有值,有些是0。为什么你要使用
log(0)
,或者
5/0
?hi@user2357112,给定的数据(nu[1])是0,在整个数据集中,有些数据是有值的,有些是0.0,
log(5/0)
也是
Inf
。直到你尝试将无限值乘以零,你才能得到NaN,这是真的。我想我主要是想强调包含了两个未定义的数字,R非常友好,可以定义为-Inf和Inf,但它们本身应该都是NaN。这不可能计算为-0。52@Mark,谢谢您的提醒,重新计算后我已更正为-3.68。那么,
log(5/0)
也是
Inf
。直到你尝试将无限值乘以零,你才能得到NaN,这是真的。我想我主要是想强调包含了两个未定义的数字,R非常友好,可以定义为-Inf和Inf,但它们本身应该都是NaN。这不可能计算为-0。52@Mark,谢谢您的提醒,重新计算后,我已更正为-3.68。