2012-12-19 26 views
6

Tôi muốn biết nếu có cách nào để tạo các hàm Rcpp bằng cách sử dụng các gói inline trong chức năng chính. Đây là một ví dụ về những gì tôi muốn làm:Rcpp + nội tuyến - tạo và gọi các chức năng bổ sung

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); 
          ") 

mà nên kết quả trong:

> cpp.fun(a) 
[1] 1 4 9 16 25 36 49 64 81 100 

Tuy nhiên tôi biết rằng trình biên dịch sẽ không chấp nhận việc tạo ra các chức năng của riêng bạn trong các phương pháp chính. Làm cách nào để tôi tạo và gọi một hàm Rcpp khác với inline mà không phải chuyển qua R?

Trả lời

14

body là dành cho các cơ quan chức năng, bạn muốn nhìn vào includes đối số của cxxfunction:

library(inline) 
library(Rcpp) 
a = 1:10 
cpp.fun = cxxfunction(signature(data1="numeric"), 
         plugin="Rcpp", 
         body=' 

IntegerVector fun_data = data1; 
int n = fun_data.size(); 
for(int i=0;i<n;i++){ 
    fun_data[i] = fun1(fun_data[i]); 
} 
return(fun_data); 
', includes = ' 

int fun1(int a1){ 
    int b1 = a1; 
    b1 = b1*b1; 
    return(b1); 
} 

')  
cpp.fun(a) 

?cxxfunction đã trình bày chi tiết tài liệu về includes đối số của nó.

Nhưng lưu ý rằng phiên bản này sẽ thực hiện các thay đổi tại chỗ trong vectơ đầu vào của bạn, có thể không phải là những gì bạn muốn. Một phiên bản đó cũng lợi dụng Rcpp phiên bản của sapply:

library(inline) 
library(Rcpp) 
a = 1:10 
cpp.fun = cxxfunction(signature(data1="numeric"), 
         plugin="Rcpp", 
         body=' 

IntegerVector fun_data = data1; 
IntegerVector out = sapply(fun_data, fun1) ; 
return(out); 
', includes = ' 

int fun1(int a1){ 
    int b1 = a1; 
    b1 = b1*b1; 
    return(b1); 
} 

')  
cpp.fun(a) 
a 

Cuối cùng, bạn chắc chắn nên có một cái nhìn tại sourceCpp. Với nó, bạn sẽ viết mã của bạn trong một file .cpp, bao gồm:

#include <Rcpp.h> 
using namespace Rcpp ; 

int fun1(int a1){ 
    int b1 = a1; 
    b1 = b1*b1; 
    return(b1); 
} 

// [[Rcpp::export]] 
IntegerVector fun(IntegerVector fun_data){ 
    IntegerVector out = sapply(fun_data, fun1) ; 
    return(out); 
} 

Và sau đó, bạn có thể chỉ sourceCpp tập tin của bạn và gọi hàm:

sourceCpp("file.cpp") 
fun(1:10) 
# [1] 1 4 9 16 25 36 49 64 81 100 
+1

Cảm ơn bạn đã tip. – honeyoak

+2

Chắc chắn. Chào mừng bạn trên Stack Overflow. Xin vui lòng upvote và chấp nhận câu trả lời này nếu nó phù hợp với bạn. (hãy truy cập http://stackoverflow.com/faq nếu bạn không biết ý tôi là gì) –

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