2013-09-28 6 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 버전 이제

: 단지 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은 그렇지 않습니다. 다른 분포, 예를 들어, 음 이항 또한 작용한다.

의견을 보내 주시면 대단히 감사하겠습니다.

답변

1

첫 번째 예는 "우스운 냄새"입니다. main()Rcpp.h으로 빌드 할 수 없습니다. Rcpp.h개의 애드온을 의미합니다. 여기에는 메인을 제공하는 R에로드됩니다.

지금, 당신은 당신이, R을 포함 할 것이다

  1. RInside을 사용할 수 있으며 Rcpp.h를 사용하여 얻을
  2. Rcpp
  3. 의 나머지 부분 또는 당신은 또한 R에서 제공하는 독립 수학 라이브러리 Rmath을 사용할 수 있습니다 (내 패키지를 통해 Debian/Ubuntu의 경우 r-mathlib 패키지로 제공됩니다).

여기에서 올바른 컨텍스트를 사용하고 있기 때문에 두 번째 예제가 작동합니다. 첫 번째는 그렇지 않습니다. 그 의미에서 당신의 비교는 꺼져 있습니다.

편집 다음은 qbeta 않는 내가 주위를 어슬렁했다 샘플 프로그램입니다. 여기에 어떤 Rcpp, 쓰기 R 확장에 설명 된대로 R의의 MathLib 단지 외부 사용 :

// -*- 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; 
} 

은/링크 경로가 데비안/우분투 작업을 포함하지 않습니다; 주석 달린 첫 번째 세 줄은 한 줄에서 들여 쓰여졌습니다 (이맥스 사용을위한 것입니다).

+0

이것은 R에서 호출 한 프로세스의 일부인 훨씬 더 많은 클래스 집합에서 추출한 사례입니다 (그리고 좋은 이유이기도 함).) 나는'qgamma' 호출에서보고 있던 오류를 좁혔다. 나는 단지 ''을 포함하려고 했으므로 qgamma에 대해서는 오류가 있지만 qnorm에는 잘못된 결과를 얻는다. 그러나 -lRmath를 추가하면 작업이 완료되었습니다. 내 makefile로 돌아가서 -lRmath가 링크 파일 목록에없는 이유를 확인해야합니다. 감사!!! – jbowman

+0

(당신이 말한 것이 사실이라면) 당신은 _Rcpp_ 예제 (RcppExamples)에서 헤어졌다. 이들은 다릅니다. 이유는 무엇입니까? 하나는 모든 R 뒤에 있으며, 하나는 그렇지 않습니다. 이것이 바로 Rmath와 DEFINE을 필요로하는 이유입니다. –

+0

예, 당신이 말하는 것을 어렴풋이 보입니다. C/C++ 부분 (및 C/make/etc.와의 친숙 함)의 크기로 인해 개발을 C/C++ devel 및 R devel로 분할하려고 시도하고 독립 실행 형 C/C++ 부분을 개발했지만 나는 그것이 실수일지도 모른다는 결론을 내리기 시작했다. 왜냐하면 그것들은 내가 생각한 것보다 (특히 R 함수가 될 것이라는 점을 감안할 때) 더 단단히 연결되어 있기 때문이다. - 또는 아마도 더 정확하게, 나는 얼마나 많이 과소 평가 했는가? Rcpp이 나를 위해 할 수 있습니다. 보다 많은 선행 학습과 개발 프로세스의 재구성은 더 좋은 방법입니다. – jbowman

관련 문제