我正在阅读“使用Rcpp进行无缝R和C ++集成”的第4章,我遇到了一些问题。
在“列表4.13”中,本书给出了一个关于如何使用R函数的例子。我试过使用其他函数(不同的例子)并且我获得了成功。我的代码在这里:
#include <Rcpp.h>
// [[Rcpp::export]]
Rcpp::DataFrame myrandom(Rcpp::NumericVector x) {
int n = x.size();
Rcpp::NumericVector y1(n), y2(n), y3(n);
y1 = Rcpp::pexp(x,1.0,1,0);
y2 = Rcpp::pnorm(x,0.0,1.0,1,0);
y3 = Rcpp::ppois(x,3.0,1,0);
return Rcpp::DataFrame::create(Rcpp::Named("Exp") = y1,Rcpp::Named("Norm") = y2, Rcpp::Named("Pois") = y3);
}
sourceCpp("random.cpp")
myrandom(c(0.5,1))
在这种情况下可以,但是当我尝试使用 Rcpp :: pt 时,我没有成功。我的代码在这里。
#include <Rcpp.h>
// [[Rcpp::export]]
Rcpp::DataFrame myrandom2(Rcpp::NumericVector x) {
int n = x.size();
Rcpp::NumericVector y1(n);
y1 = Rcpp::pt(x,3.0,0,1,0);
return Rcpp::DataFrame::create(Rcpp::Named("T") = y1);
}
sourceCpp("random2.cpp")
myrandom2(c(0.5,1))
/Library/Frameworks/R.framework/Versions/3.0/Resources/library/Rcpp/include/Rcpp/stats/nt.h: In function ‘Rcpp::stats::P2<RTYPE, NA, T> Rcpp::pt(const Rcpp::VectorBase<RTYPE, NA, VECTOR>&, double, double, bool, bool) [with int RTYPE = 14, bool NA = true, T = Rcpp::Vector<14>]’:
random2.cpp:8: instantiated from here
/Library/Frameworks/R.framework/Versions/3.0/Resources/library/Rcpp/include/Rcpp/stats/nt.h:25: error: invalid conversion from ‘double (*)(double, double, int, int)’ to ‘double (*)(double, double, double, int, int)’
/Library/Frameworks/R.framework/Versions/3.0/Resources/library/Rcpp/include/Rcpp/stats/nt.h:25: error: initializing argument 1 of ‘Rcpp::stats::P2<RTYPE, NA, T>::P2(double (*)(double, double, double, int, int), const Rcpp::VectorBase<RTYPE, NA, VECTOR>&, double, double, bool, bool) [with int RTYPE = 14, bool NA = true, T = Rcpp::Vector<14>]’
make: *** [random2.o] Error 1
llvm-g++-4.2 -arch x86_64 -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG -I/usr/local/include -I"/Library/Frameworks/R.framework/Versions/3.0/Resources/library/Rcpp/include" -fPIC -mtune=core2 -g -O2 -c random2.cpp -o random2.o
当我使用Rcpp :: pt(x,3)时,我想控制de参数od函数
pt(q, df, ncp, lower.tail = TRUE, log.p = FALSE)
我认为我没有正确使用de function但我不知道是什么。
答案 0 :(得分:8)
C ++编译器消息不是很可爱吗? ; - )
我认为你刚刚帮助压制了一个非常老的bug。对于t和F,R实际上有两个 函数组(r | p | q | d)t和(r | p | q | d)nt(同上f和nf)其中第二种形式 允许非中心性参数。我认为nt.h的标题是错误的。
如果您在文件include/Rcpp/stats/nt.h
@@ -22,7 +22,7 @@
#ifndef Rcpp__stats__nt_h
#define Rcpp__stats__nt_h
-RCPP_DPQ_2(t,::Rf_dt,::Rf_pt,::Rf_qt)
+RCPP_DPQ_2(nt,::Rf_dnt,::Rf_pnt,::Rf_qnt)
#endif
(你可以在标题中编辑,不需要重新安装)然后事情似乎有效:
#include <Rcpp.h>
// [[Rcpp::export]]
Rcpp::DataFrame myrandom(Rcpp::NumericVector x) {
Rcpp::NumericVector y1, y2, y3, y4, y5, y6, y7, y8;
y1 = Rcpp::pexp(x,1.0,1,0);
y2 = Rcpp::pnorm(x,0.0,1.0,1,0);
y3 = Rcpp::ppois(x,3.0,1,0);
y4 = Rcpp::pt(x,3.0,1,0);
y5 = Rcpp::pnt(x,3.0,2,TRUE,FALSE);
y6 = Rcpp::pnt(x,3.0,2,TRUE,TRUE);
y7 = Rcpp::pnt(x,3.0,2,FALSE,TRUE);
y8 = Rcpp::pnt(x,3.0,2,FALSE,FALSE);
return Rcpp::DataFrame::create(Rcpp::Named("Exp") = y1,
Rcpp::Named("Norm") = y2,
Rcpp::Named("Pois") = y3,
Rcpp::Named("t") = y4,
Rcpp::Named("nt1") = y5,
Rcpp::Named("nt2") = y6,
Rcpp::Named("nt3") = y7,
Rcpp::Named("nt4") = y8);
}
我仍然需要检查R的数字,但至少它现在构建。 (对于1/0而言,TRUE / FALSE无关紧要;可以正确投射)。
编辑:以下是一些输出:
> sourceCpp("/tmp/so1.cpp")
R> myrandom(seq(0.2, 0.5, by=0.1))
Exp Norm Pois t nt1 nt2 nt3 nt4
1 0.181269 0.579260 0.0497871 0.572865 0.0351335 -3.34860 -0.0357655 0.964866
2 0.259182 0.617911 0.0497871 0.608118 0.0434710 -3.13566 -0.0444441 0.956529
3 0.329680 0.655422 0.0497871 0.642032 0.0535219 -2.92767 -0.0550074 0.946478
4 0.393469 0.691462 0.0497871 0.674276 0.0654790 -2.72603 -0.0677212 0.934521
R>
答案 1 :(得分:5)
似乎Student-t分布没有非中心性参数ncp
;来自Rmath.h:
/* Student t Distibution */
inline double dt(double x, double n, int lg) { return ::Rf_dt(x, n, lg); }
inline double pt(double x, double n, int lt, int lg) { return ::Rf_pt(x, n, lt, lg); }
inline double qt(double p, double n, int lt, int lg) { return ::Rf_qt(p, n, lt, lg); }
inline double rt(double n) { return ::Rf_rt(n); }
我可以通过以下更改编译和执行您的代码:
#include <Rcpp.h>
// [[Rcpp::export]]
Rcpp::DataFrame myrandom2(Rcpp::NumericVector x) {
int n = x.size();
Rcpp::NumericVector y1(n);
y1 = Rcpp::pt(x, 3.0, false, true);
return Rcpp::DataFrame::create(Rcpp::Named("T") = y1);
}