当我尝试从R包导入dnorm()和pnorm()函数stats到Rcpp 时,我遇到了以下奇怪的行为.余均适用dnorm()和pnorm()均值为0,标准偏差为1〜观测的向量.如果我在同一个向量上重复计算几次,有时我会得到不同的结果.看起来我在导入这两个函数时出错了,但这并不能解释为什么结果有时好,而其他不一致.
我把这里导入dnorm()和pnorm()函数的函数放在这里stats:
{test_imp_script<-'
using Eigen::VectorXd;
VectorXd a = Rcpp::as<VectorXd>(aa);
Environment st("package:stats");
Function dn = st["dnorm"];
Function pn = st["pnorm"];
SEXP dd_a = dn(a,0,1);
SEXP pp_a = pn(a,0,1);
VectorXd d_a = as<VectorXd>(dd_a);
VectorXd p_a = as<VectorXd>(pp_a);
return List::create(Named("d") = d_a,Named("p") = p_a);'}
test_imp <- cxxfunction(signature( aa="numeric"), test_imp_script, plugin = "RcppEigen")
Run Code Online (Sandbox Code Playgroud)
现在,尝试使用2000次重复运行以下示例test_imp.
set.seed(123)
t<-rnorm(1000,0,1)
a<-test_imp(t)
for (i in 1:2000){
set.seed(123)
b<-test_imp(t)
cat(i,"d",c(sum(b$d),sum(b$p)),"\n")
if (any(a$d!=b$d)) break
if (any(a$p!=b$p)) break
}
Run Code Online (Sandbox Code Playgroud)
有时,实验在到达循环结束之前就会中断.有时却没有.没有明确的模式.
谢谢你的回复.
OMG已经可以使用了.
首先,通过糖:
R> library(Rcpp)
R> cppFunction("NumericVector ex1() { return rnorm(5, 0, 1); }")
R> set.seed(42); ex1()
[1] 1.370958 -0.564698 0.363128 0.632863 0.404268
R>
Run Code Online (Sandbox Code Playgroud)
第二,通过便利命名空间(但请注意,这不是矢量化)
R> cppFunction("double ex2() { return R::rnorm(0, 1); }")
R> set.seed(42); ex2()
[1] 1.37096
R>
Run Code Online (Sandbox Code Playgroud)
第三,如果你坚持,直接调用R API,这比以前的答案更少,但更丑陋:
R> cppFunction("double ex3() { return Rf_rnorm(0, 1); }")
R> set.seed(42); ex3()
[1] 1.37096
R>
Run Code Online (Sandbox Code Playgroud)
我们不遗余力地提供免费和全面的文档.我真的不认为你看过它.这样做会对你有利,因为不再依赖别人在这里为你重新输入.
(是的,你没有问dnorm及pnorm,但所有所谓的d/P/Q/R的统计分布函数并行执行.因此,其中rnorm存在,你也有dnorm,qnorm并且pnorm,当然有不同的参数的.)