2015-12-04 10 views
0

我正在使用ars(自適應拒絕採樣)庫來對凹面密度分佈中的給定變量進行採樣。如何從不引發異常的庫函數中捕獲錯誤(`ars`)?

事情是,ars功能打印「ifault代碼」,當出現錯誤,但顯然它不會拋出任何異常。

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) 

的問題是,我稱之爲從蟒蛇的ars功能使用rpy2,我需要我的程序知道ars是否已經能夠生成樣本。也就是說,我想ars拋出一個真正的異常或返回一些特殊的價值。

我該如何發現錯誤?

+0

'if(grepl(' ')' – doicomehereoften1

+0

變量'mysample'的值不是ifault代碼:( – alberto

+2

)爲什麼不重寫'ars'的代碼,以便它的行爲符合你期望的nmanner?來自'doicomehereoften'的註釋不太可能因爲代碼顯示消息是用'cat'構造的,這只是一個副作用 –

回答

2

重寫代碼,使結論部分做你想要的。這可能是函數的最後部分的一種可能的變體:

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) 
+0

然後你用'ars'或'ars2'調用它的新函數? – alberto

+0

我不確定這是如何設置的,即我不知道您是否可以從R控制檯執行此操作,並期望python進行連接,或者您需要從python傳遞的腳本發送所有這些內容。 (第二個選項在會話開始時只能進行一次)。第三個選項(或者只是第二個選項)將在加載之前重寫R-package。但是我確信一旦安裝完成,你就可以從python調用'ars2'。 –

+0

從'R'就足夠了。這很奇怪,我想我得到一個帶有ifault代碼的'mysample'列表,所以我不能再現它了。我粘貼了我現在的代碼。 – alberto