将dnorm和pnorm函数从R导入Rcpp时出现问题

Issue importing dnorm and pnorm functions from R to Rcpp

本文关键字:Rcpp 问题 导入 dnorm pnorm 函数      更新时间:2023-10-16

当我试图将dnorm()pnorm()函数从R包stats导入Rcpp时,遇到了以下奇怪的行为。我将平均值为0、标准偏差为1的dnorm()pnorm()应用于观测向量。如果我在同一个向量上重复计算几次,有时会得到不同的结果。看起来我在导入这两个函数时做错了什么,但这并不能解释为什么结果有时是好的,有时是不一致的。

我在这里放了从stats:导入dnorm()pnorm()函数的函数

    {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")

现在,尝试运行下面的例子,重复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    
    }

有时,实验在循环结束之前就中断了。有时情况并非如此。没有明确的模式。

感谢您的回复。

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> 

其次,通过一个方便的名称空间(但请注意,这不是矢量化的)

R> cppFunction("double ex2() { return R::rnorm(0, 1); }")
R> set.seed(42); ex2()
[1] 1.37096
R> 

第三,如果你坚持,直接调用R API,这是以前的答案越少,但更丑:

R> cppFunction("double ex3() { return Rf_rnorm(0, 1); }")
R> set.seed(42); ex3()
[1] 1.37096
R> 

我们已经尽力提供免费和全面的文件。我真的不认为你看过。这样做对你有利,因为你不再依赖别人在这里为你重新打字。

(是的,您确实要求dnormpnorm,但所有用于统计分布的所谓d/p/q/r函数都是并行实现的。因此,在存在rnorm的情况下,您也有dnormqnormpnorm,当然有不同的参数。)