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 버전 이제
: 단지 R 프롬프트에서qgamma
를 호출하는 경우
가
> foosrc <- "double foo() {return R::qgamma(0.3, 5.0, 5.0, 1, 0);}"
> bar <- cppFunction(foosrc)
> bar()
[1] 18.16805
(. 같은 컴퓨터가, 자연이 하나가 RStudio에서 실행)
주, 세 번째 매개 변수는 필요가 같은 대답을 얻기 위해 거꾸로 (이 예에서는 0.2).
qnorm
이 실제로 작동하지 않는다면 RcppExamples 디렉토리에서 실제로 복사되는 makefile을 엉망으로 만들 수 있습니다. dgamma
도 작동하지만 pgamma
은 그렇지 않습니다. 다른 분포, 예를 들어, 음 이항 또한 작용한다.
의견을 보내 주시면 대단히 감사하겠습니다.
이것은 R에서 호출 한 프로세스의 일부인 훨씬 더 많은 클래스 집합에서 추출한 사례입니다 (그리고 좋은 이유이기도 함).) 나는'qgamma' 호출에서보고 있던 오류를 좁혔다. 나는 단지 ''을 포함하려고 했으므로 qgamma에 대해서는 오류가 있지만 qnorm에는 잘못된 결과를 얻는다. 그러나 -lRmath를 추가하면 작업이 완료되었습니다. 내 makefile로 돌아가서 -lRmath가 링크 파일 목록에없는 이유를 확인해야합니다. 감사!!! –
jbowman
(당신이 말한 것이 사실이라면) 당신은 _Rcpp_ 예제 (RcppExamples)에서 헤어졌다. 이들은 다릅니다. 이유는 무엇입니까? 하나는 모든 R 뒤에 있으며, 하나는 그렇지 않습니다. 이것이 바로 Rmath와 DEFINE을 필요로하는 이유입니다. –
예, 당신이 말하는 것을 어렴풋이 보입니다. C/C++ 부분 (및 C/make/etc.와의 친숙 함)의 크기로 인해 개발을 C/C++ devel 및 R devel로 분할하려고 시도하고 독립 실행 형 C/C++ 부분을 개발했지만 나는 그것이 실수일지도 모른다는 결론을 내리기 시작했다. 왜냐하면 그것들은 내가 생각한 것보다 (특히 R 함수가 될 것이라는 점을 감안할 때) 더 단단히 연결되어 있기 때문이다. - 또는 아마도 더 정확하게, 나는 얼마나 많이 과소 평가 했는가? Rcpp이 나를 위해 할 수 있습니다. 보다 많은 선행 학습과 개발 프로세스의 재구성은 더 좋은 방법입니다. – jbowman