使用含有具有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