2013-09-28 23 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