我在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