使用含有具有C一個.cpp文件中RCPP包的Rcpp.package.skeleton
函數I已經創建了一個包++函數返回0:結果不一致內部lapply
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
RcppExport SEXP just_zero() {
BEGIN_RCPP
Rcpp::RNGScope __rngScope;
return wrap(0.0);
END_RCPP
}
當安裝並加載包從RI可以通過lapply通過.Call調用函數。正如預期的那樣,它(似乎)總是返回0:
> x <- lapply(seq(10000), function(i) { x <- .Call('just_zero'); stopifnot(x == 0); x })
#*no errors!*
但是,顯然這是由lapply
返回的值包含非零:
> range(simplify2array(x))
[1] 0 3
不幸的是,使用set.seed
不使這些返回的值是可重複的,有時我確實得到了[1] 0 0
,有時候其他值,例如[1] "0" "TRUE"
。另外一個線索是刪除線路Rcpp::RNGScope __rngScope;
解決了這個問題。
爲什麼lapply
返回的對象中有非零元素(特別是我們檢查過.Call
返回的值),以及RNGScope
如何使用它?
我抄錄如下貼在Linux上這種行爲和OS X.會話信息從OS X:
> sessionInfo()
R Under development (unstable) (2016-08-03 r71023)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: OS X Mavericks 10.9.5
locale:
[1] en_GB.UTF-8/en_GB.UTF-8/en_GB.UTF-8/C/en_GB.UTF-8/en_GB.UTF-8
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] bug_1.0 devtools_1.12.0
loaded via a namespace (and not attached):
[1] tools_3.4.0 withr_1.0.2 memoise_1.0.0 Rcpp_0.12.6 git2r_0.15.0
[6] digest_0.6.10
'Rcpp :: wrap()'助手是**不是**模板化的。它採用它的參數,並返回一個「SEXP」。但正如@coatless向您解釋的,通過Rcpp屬性可以更輕鬆地實現這一切。 –
謝謝!現在已經在這個問題中得到了反映... – Daniel