2012-12-19 14 views
6

मैं जानना चाहता हूं कि फ़ंक्शन को मुख्य फ़ंक्शन के भीतर inline पैकेज का उपयोग करने का कोई तरीका है या नहीं।आरसीपीपी + इनलाइन - अतिरिक्त कार्यों को बनाने और कॉल करने

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

जो परिणाम चाहिए में:

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

लेकिन मुझे पता है कि संकलक मुख्य विधि में अपना एकल समारोह के निर्माण को स्वीकार नहीं करेगा यह है कि मैं क्या करना चाहते हैं का एक उदाहरण है। मैं फ़ंक्शन को inline के साथ आर के माध्यम से पास किए बिना बनाने और कॉल करने के बारे में कैसे जाउंगा?

उत्तर

14

body समारोह के शरीर के लिए है, तो आप cxxfunction की includes तर्क को देखने के लिए चाहते हैं:

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 अपने includes तर्क के बारे में दस्तावेज़ विस्तृत हो गया है।

लेकिन ध्यान दें कि यह संस्करण आपके इनपुट वेक्टर में जगह संशोधन में होगा, जो शायद आप नहीं चाहते हैं। एक और संस्करण है कि यह भी sapply की Rcpp संस्करण का लाभ लेता है:

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 

अंत में, आप निश्चित रूप से sourceCpp पर एक नजर है चाहिए। तो, तुम बस sourceCpp अपनी फ़ाइल कर सकते हैं

#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); 
} 

और और समारोह आह्वान: यह के साथ आप एक .cpp फाइल में अपने कोड लिखने होता है, जिसमें

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

टिप के लिए धन्यवाद। – honeyoak

+2

निश्चित रूप से। स्टैक ओवरफ़्लो पर आपका स्वागत है। यदि यह उपयुक्त है तो कृपया उत्तर दें और इस उत्तर को स्वीकार करें। (http://stackoverflow.com/faq पर जाएं यदि आप नहीं जानते कि मेरा क्या मतलब है) –

संबंधित मुद्दे