2013-09-28 24 views
0

我在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不适用。其他分布,例如负二项式也是有效的。

任何建议,将不胜感激!

回答

1

你的第一个例子“味道很有趣”。你根本不能随机构建main()Rcpp.h,因为Rcpp.h是为我们加载到R的附加组件提供的,它提供其主要的。现在

,您可以使用

  1. RInside这将让你嵌入R,和你使用Rcpp.h和RCPP
  2. 其余
  3. 或者你也可以使用独立的数学库Rmath也由R提供(并可通过我的包装以Debian/Ubuntu的包r-mathlib的形式提供)。

你的第二个例子工作,因为你在这里使用正确的上下文。第一个不是。在这个意义上你的比较是关闭的。

编辑下面是我游逛的样本程序,它确实qbeta。没有RCPP这里,只需外用的r Mathlib作为记录在写作R附加

// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; 
//   compile-command: "gcc -s -Wall -O3 -I/usr/share/R/include 
//        -o rmath_qbeta rmath_qbeta.c -lRmath -lm" -*- 

#include <stdio.h> 

#define MATHLIB_STANDALONE 1 
#include <Rmath.h> 

int main(void) { 

    double x = 0.25, a = 0.8, b = 2.0; 

    printf("qbeta: %f %f %f %f\n", 
      qbeta(x, a, b, 0, 0), 
      qbeta(log(x), a, b, 0, 1), 
      qbeta(x, a, b, 1, 0), 
      qbeta(log(x), a, b, 1, 1)); 

    return 0; 
} 

包括/链接路径在Debian/Ubuntu的工作;评论的前三行是从一行缩进(这是Emacs的使用)。

+0

这是一个更大的一组类,它实际上是从R调用的进程的一部分(也有很好的理由)。)我缩小了我看到的“qgamma”调用的错误。我尝试了''作为包含,并得到相同的错误结果qqamma,但不是qnorm。但是,加入-lRmath完成了这项工作。我将不得不回到我的makefile,看看为什么-lRmath不在链接文件列表中。谢谢!!! – jbowman

+0

因为(如果你说的是真的)你从_Rcpp_例子(RcppExamples)中分离出来。这些不同。你需要好好理解一个原因:其中一个具有整个R,一个不具备 - 这就是为什么你需要Rmath和DEFINE来启用它 –

+0

是的,我可以模糊地看到你在说什么。由于C/C++部分的大小(以及我对C/make/etc的熟悉程度),我试图将开发划分为C/C++开发和R开发,并开发C/C++部分独立开发,但我开始得出这样的结论,这可能是一个错误,因为它们之间的耦合更加紧密(尤其是它最终都将是R函数),或者更准确地说,我低估了多少Rcpp可能会为我做。更多的前期学习和开发过程的重组似乎是一条更好的途径。 – jbowman