[R] NaNs produced as a returned value for a function

William Dunlap wdunlap at tibco.com
Sun Feb 14 21:08:59 CET 2016


You can do things like
   while ( !is.nan( r <- randomFunction(x) )) {}
   # r will be a non-NaN value of randomFunction(x) now
or
   for(i in seq_len(1000)) {
      if (!is.nan( r <- randomFunction(x))) {
          break
      }
      if (i == 1000) {
          stop("no good values of randomFunction(x) in 1000 tries")
      }
   }
to avoid infinite loops when randomFunction [almost] always produces a NaN.

You may  be able to avoid some NaNs by replacing log(b^n) with n*log(b) and
log(prod(x^b)) with sum(b*log(x)).  That would avoid unneeded Inf values,
which
can lead to NaN down the line (Inf-Inf -> NaN, Inf/Inf -> NaN).


Bill Dunlap
TIBCO Software
wdunlap tibco.com

On Sun, Feb 14, 2016 at 9:22 AM, Maram SAlem <marammagdysalem at gmail.com>
wrote:

> Hi all,
>
> I'm trying to write 2 functions(as a part of a larger code) to evaluate a
> certain equation.  The function is :
>
> X= c (0.3893094  2.0962311  2.6007558  3.0761810  3.3246947  3.3917976
>  4.1981546  6.8826140 12.3128013 15.5588470)
> R=c (0 1 0 0 0 1 1 1 0 1)
>
> alpha.update=function(X, R, alpha.curr, beta.curr=1 ,m=10,
> hyp=c(3,15,6,22.5))
>
>   {
>
>   o<-numeric(m)
>
>      for (i in 1:m) {
>
>        o[i]<- (1+R[i])*((X[i])^(beta.curr))
>
>         }
>
>    sh<-sum(o) + hyp[2] + (hyp[4]* beta.curr)
>
>    rg<-rgamma(1, shape= m+hyp[1]+hyp[3] , rate = sh )
>
>    return(rg)
>
>    }
>
>
> alpha.curr<- alpha.update(X, R, alpha.curr=0.2, beta.curr=1 ,m, hyp)
>
>
>     bettarg<- function(X, R, alpha.curr, beta.curr=1 ,m=10,
> hyp=c(3,15,6,22.5))
>
>        {
>
>            o<-numeric(m)
>
>            for (i in 1:m) {
>
>        o[i]<- (1+R[i])*((X[i])^( beta.curr))
>
>         }
>
>       logbt<- log(beta.curr ^(m+hyp[3]-1)) + log(prod((X)^( beta.curr -1)))
> + (-1*alpha.curr *(sum(o) +  (hyp[4]* beta.curr)))
>
>
>
>       bt<- exp(logbt)
>
>       return(bt)
>
>        }
>
>
> The problem is that the function bettarg() sometimes produces   NaN, and
> this stops the evaluation of my equation, so how can I force it to ignore
> the NaNs produced and repeat the evaluation again till it prroduces a
> number?
>
>
> Thanks in advance,
>
>
> Maram Salem
>
>         [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide
> http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>

	[[alternative HTML version deleted]]



More information about the R-help mailing list