2014-05-07 14 views
8

Tôi lấy ví dụ này từ một câu hỏi khác. Tôi đang xây dựng một gói R với Rcpp. Tôi có chức năng như fun1 (bên dưới) mà tôi muốn đưa vào tệp .cpp của riêng mình. Sau đó, tôi muốn gọi fun1 với các chức năng khác (như fun() làm bên dưới). Tôi muốn fun1 trong một tệp riêng biệt bởi vì tôi sẽ gọi nó từ một số hàm Rcpp trong các tệp .cpp khác nhau. Có những tuyên bố bao gồm nhất định và những điều tôi cần làm để có thể truy cập chức năng fun1 trong số .cpp nơi có fun() không? Cảm ơn bạn.Gọi hàm Rcpp từ một hàm Rcpp khác trong khi xây dựng gói R

library(inline) 
library(Rcpp) 
a = 1:10 
cpp.fun = cxxfunction(signature(data1="numeric"), 
        plugin="Rcpp", 
        body=" 
int fun1(int a1) 
{int b1 = a1; 
b1 = b1*b1; 
return(b1); 
} 

NumericVector fun_data = data1; 
int n = data1.size(); 
for(i=0;i<n;i++){ 
fun_data[i] = fun1(fun_data[i]); 
} 
return(fun_data); 
          ") 

Vì vậy, đối với mã của tôi, tôi sẽ có hai .cpp file:

#include <Rcpp.h> 
using namespace Rcpp; 
// I think I need something here to make fun1.cpp available? 

// [[Rcpp::export]] 
Rcpp::NumericVector fun(Rcpp::NumericVector data1) 
{ 
    NumericVector fun_data = data1; 
    int n = data1.size(); 
    for(i=0;i<n;i++){ 
    fun_data[i] = fun1(fun_data[i]); 
    } 
    return(fun_data); 
} 

Và một giây .cpp file:

#include <Rcpp.h> 
using namespace Rcpp; 

// [[Rcpp::export]] 
int fun1(int a1) 
{int b1 = a1; 
b1 = b1*b1; 
return(b1); 
} 
+1

Đây thực sự là sử dụng cơ bản của C++ và không liên quan gì đến Rcpp. Tìm hiểu cách sử dụng một tệp tiêu đề chung mà bất kỳ sách C++ (hoặc thậm chí C) nào đều sẽ bao gồm. –

Trả lời

9

Hai giải pháp khả thi:

Các 'Xóa nhanh và 'bẩn', giải pháp - bao gồm khai báo hàm trong tệp nơi bạn sử dụng nó:

#include <Rcpp.h> 
using namespace Rcpp; 

// declare fun1 
int fun1(int a1); 

// [[Rcpp::export]] 
Rcpp::NumericVector fun(Rcpp::NumericVector data1) 
{ 
    NumericVector fun_data = data1; 
    int n = data1.size(); 
    for(i=0;i<n;i++){ 
    fun_data[i] = fun1(fun_data[i]); 
    } 
    return(fun_data); 
} 

Các giải pháp mạnh mẽ hơn: ghi tập tin tiêu đề mà tuyên bố các chức năng, có thể sau đó được #include -ed trong mỗi tập tin. Vì vậy, bạn có thể có một tập tin header fun1.h trong cùng src thư mục:

#ifndef PKG_FOO1_H 
#define PKG_FOO1_H 

int foo(int); 

#endif 

mà sau đó bạn có thể sử dụng với một cái gì đó như:

#include <Rcpp.h> 
#include "fun1.h" 
using namespace Rcpp; 

// [[Rcpp::export]] 
Rcpp::NumericVector fun(Rcpp::NumericVector data1) 
{ 
    NumericVector fun_data = data1; 
    int n = data1.size(); 
    for(i=0;i<n;i++){ 
    fun_data[i] = fun1(fun_data[i]); 
    } 
    return(fun_data); 
} 

Khi bạn tiến bộ, bạn sẽ cần phải tìm hiểu thêm Kỹ năng lập trình C++, vì vậy tôi khuyên bạn nên kiểm tra one of the books here; đặc biệt, Accelerated C++ là một phần giới thiệu tuyệt vời.

+0

Cảm ơn bạn đã trả lời rõ ràng, điều này làm việc hoàn hảo. Trước đây tôi không biết các tập tin .h đã làm việc với Rcpp hoặc nơi đặt chúng. Tôi đã có một năm của các khóa học C++, rất nhiều tài liệu Rcpp vẫn không thể truy cập được. Nhưng Rcpp thật tuyệt vời cho MCMC. – user3583481

Các vấn đề liên quan