2016-07-29 76 views
-1

我在Rcpp聲明如下功能:錯誤建築包裝

#include <Rcpp.h> 
// [[Rcpp::depends(RcppArmadillo)]] 
#include <Rmath.h> 

using namespace Rcpp; 

// [[Rcpp::export]] 
double loglikZeta(double zold, double zstar, NumericVector y, int K, double p){ 
NumericVector num = Rcpp::dbinom(y,K,p*zstar); 
NumericVector den = Rcpp::dbinom(y,K,p*zold); 
return (num[0]/den[0]); 
} 

// [[Rcpp::export]] 
double singleZetaSampler(NumericVector z, NumericVector y, 
        double p, int K, int i, double zstar){ 

return loglikZeta(z[i-1],zstar,y[i-1],K,p); 
} 

現在宣佈(已裝包和文件後):

z <- y <- c(rep(1,20),rep(0,20)) 
n <- length(y) 
K <- 3 
p <- 0.5 
i <- 30 
zstar <- 1 

意外的行爲是,如果我嘗試打電話給我每次都有不同的結果(功能中沒有任何隨機):

singleZetaSampler(z,y,p,K,i,zstar) 
[1] 1.000051 
singleZetaSampler(z,y,p,K,i,zstar) 
[1] 0.1887447 
singleZetaSampler(z,y,p,K,i,zstar) 
[1] 0.9999998 

我在這裏做了什麼大錯誤,或者這些結果實際上是意外的?

編輯:

很抱歉,如果函數不使用,因爲它是感覺。這是原來的功能:

// [[Rcpp::export]] 
NumericVector zetaSampler(int n, NumericVector z, NumericVector y, 
         double p, int K){ 
NumericVector xx(n); 
for(int i = 0; i < n; i++){ 
    xx(i) = loglikZeta(z[i],1,y[i],K,p); 

} 

return xx; 
} 

,並呼籲:

zetaSampler(length(z),z,y,p,K) 

每次像以前那樣給出不同的結果。

回答

2

兩件事。一個實際的錯誤,一種風格。

風格問題是您包括Rmath.h並且當您不應該的時候取決於RcppArmadillo。真正的錯誤是你抽樣20次,但是然後設置i=30並訪問第30個元素。所以你得到隨機輸入。

這就是我剛跑過的東西,它獲得了三倍的相同結果。

#include <Rcpp.h> 

using namespace Rcpp; 

// [[Rcpp::export]] 
double loglikZeta(double zold, double zstar, NumericVector y, int K, double p){ 
    NumericVector num = Rcpp::dbinom(y,K,p*zstar); 
    NumericVector den = Rcpp::dbinom(y,K,p*zold); 
    return (num[0]/den[0]); 
} 

// [[Rcpp::export]] 
double singleZetaSampler(NumericVector z, NumericVector y, 
         double p, int K, int i, double zstar){ 

    return loglikZeta(z[i-1],zstar,y[i-1],K,p); 
} 

/*** R 
z <- y <- c(rep(1,20),rep(0,20)) 
n <- length(y) 
K <- 3 
p <- 0.5 
i <- 20 # not 30 
zstar <- 1 
singleZetaSampler(z,y,p,K,i,zstar) 
singleZetaSampler(z,y,p,K,i,zstar) 
singleZetaSampler(z,y,p,K,i,zstar) 
*/ 

輸出:

R> sourceCpp("/tmp/foo.cpp") 

R> z <- y <- c(rep(1,20),rep(0,20)) 

R> n <- length(y) 

R> K <- 3 

R> p <- 0.5 

R> i <- 20 # not 30 

R> zstar <- 1 

R> singleZetaSampler(z,y,p,K,i,zstar) 
[1] 1 

R> singleZetaSampler(z,y,p,K,i,zstar) 
[1] 1 

R> singleZetaSampler(z,y,p,K,i,zstar) 
[1] 1 
R> 

編輯:出現在修復的版本,迫使標參數更好的工作,以loglikZeta()

// [[Rcpp::export]] 
double loglikZeta(double zold, double zstar, double y, int K, double p){ 
    double num = R::dbinom(y, K, p*zstar, false); 
    double den = R::dbinom(y, K, p*zold, false); 
    return (num/den); 
} 

注意Rcpp::dbinom()Rcpp::dbinom(Rcpp::NumericVector, int, double, bool=false)簽名。

+0

對不起,我不明白爲什麼我不應該設置'我= 30' – adaien

+0

我的錯誤。急於離開辦公室。向量確實是長度爲40.不明白爲什麼你會得到不同的結果。 –

+0

不用擔心,無論如何,謝謝。我只是希望這不是一個錯誤 – adaien