如何从不抛出异常(`ars`)的库函数中捕获错误?

How to capture errors from a library function that throws no exceptions (`ars`)?

我正在使用 ars(自适应拒绝采样)库从凹密度分布中采样给定变量。

问题是 ars 函数在出错时打印“ifault codes”,但显然它不会抛出任何异常。

library(ars)

f<-function(x,mu=0,sigma=1){-1/(2*sigma^2)*(x-mu)^2}
fprima<-function(x,mu=0,sigma=1){-1/sigma^2*(x-mu)}
# mysample<-ars(1,f,fprima,mu=2,sigma=3) # it gives no errors
mysample<-ars(1,f,fprima,mu=2,sigma=3, x=c(2,4)) # bad choice of x
hist(mysample)

问题是我使用 rpy2 从 python 调用了 ars 函数,我需要我的程序知道 ars 是否能够生成样本。也就是说,我希望 ars 抛出一个真正的异常或 return 一些特殊值。

如何捕获错误?

重写代码,使结论部分符合您的要求。这可能是函数最后部分的一种可能变体:

ars2 <- function (n = 1, f, fprima, x = c(-4, 1, 4), ns = 100, m = 3, 
    emax = 64, lb = FALSE, ub = FALSE, xlb = 0, xub = 0, ...) 
{
# leave top portion the same
#......
            else {
                return( list(msg= "Error in sobroutine sample_...", ifault= sample$ifault))
            }
        }
    }
    else {
        return( list(msg="\nError in sobroutine initial_...", ifault= initial$ifault))
    }
    return(mysample)
}
# Then finish up by setting the environment for ars2
environment(ars2) <- environment(ars)