我在RedHat上运行R 2.15.2和Rcpp 10.4(前几天升级)。qgamma函数在通过Rcpp调用时返回0
当我在通过make编译的C++程序中调用qgamma函数时,它返回0,但同一程序中的qnorm返回正确的值(源代码如下)。当我通过cppFunction编译调用它时,正确答案。
C++源:
#include <iostream>
using namespace std;
#include <Rcpp.h>
int main() {
cout << R::qnorm(0.3, 1.0, 1.0, 1, 0) << endl;
cout << R::qgamma(0.3, 5.0, 5.0, 1, 0) << endl;
return 0;
}
和相关的编译消息和执行:
[[email protected] src]$ make test
g++ -I/usr/include/R -I/usr/lib64/R/library/Rcpp/include -L/usr/lib64/R/lib -lR -L/usr/lib64/R/library/Rcpp/lib -lRcpp -Wl,-rpath,/usr/lib64/R/library/Rcpp/lib -o test test.cpp
[[email protected] src]$ ./test
0.475599
0
[[email protected] src]$
正在当然问题,即 “0” 出在上述输出的第二行。
现在的cppFunction版本:
> foosrc <- "double foo() {return R::qgamma(0.3, 5.0, 5.0, 1, 0);}"
> bar <- cppFunction(foosrc)
> bar()
[1] 18.16805
(同一台计算机,自然,这一个在RStudio执行)
注意,如果只是打电话从R提示qgamma
,第三个参数需要被倒置(在这个例子中= 0.2)以得到相同的答案。
我怀疑我搞砸了我的makefile,它实际上主要是从RcppExamples目录复制的,如果它不是因为qnorm
工作的事实。 dgamma
也适用,但pgamma
不适用。其他分布,例如负二项式也是有效的。
任何建议,将不胜感激!
这是一个更大的一组类,它实际上是从R调用的进程的一部分(也有很好的理由)。)我缩小了我看到的“qgamma”调用的错误。我尝试了''作为包含,并得到相同的错误结果qqamma,但不是qnorm。但是,加入-lRmath完成了这项工作。我将不得不回到我的makefile,看看为什么-lRmath不在链接文件列表中。谢谢!!! –
jbowman
因为(如果你说的是真的)你从_Rcpp_例子(RcppExamples)中分离出来。这些不同。你需要好好理解一个原因:其中一个具有整个R,一个不具备 - 这就是为什么你需要Rmath和DEFINE来启用它 –
是的,我可以模糊地看到你在说什么。由于C/C++部分的大小(以及我对C/make/etc的熟悉程度),我试图将开发划分为C/C++开发和R开发,并开发C/C++部分独立开发,但我开始得出这样的结论,这可能是一个错误,因为它们之间的耦合更加紧密(尤其是它最终都将是R函数),或者更准确地说,我低估了多少Rcpp可能会为我做。更多的前期学习和开发过程的重组似乎是一条更好的途径。 – jbowman