खोज…


इनलाइन कोड संकलन

Rcpp में दो फ़ंक्शन हैं जो कोड संकलन इनलाइन और निर्यात को सीधे R: cppFunction() और evalCpp()sourceCpp() नामक तीसरा फ़ंक्शन sourceCpp() C ++ कोड में एक अलग फ़ाइल में पढ़ने के लिए मौजूद है, हालांकि इसे cppFunction() उपयोग किया जा सकता है।

नीचे R के भीतर C ++ फ़ंक्शन को संकलित करने का एक उदाहरण है। स्रोत को घेरने के लिए "" के उपयोग पर ध्यान दें।

# Note - This is R code.
# cppFunction in Rcpp allows for rapid testing.
require(Rcpp)

# Creates a function that multiples each element in a vector
# Returns the modified vector.
cppFunction("
NumericVector exfun(NumericVector x, int i){
x = x*i;
return x;
}")

# Calling function in R
exfun(1:5, 3)

C ++ अभिव्यक्ति उपयोग को जल्दी से समझने के लिए:

# Use evalCpp to evaluate C++ expressions
evalCpp("std::numeric_limits<double>::max()")
## [1] 1.797693e+308

आरसीपी विशेषताएँ

Rcpp विशेषताएँ R और C ++ के साथ काम करने की प्रक्रिया को सरल बनाती हैं। विशेषताओं का रूप लेते हैं:

// [[Rcpp::attribute]]

विशेषताओं का उपयोग आमतौर पर इसके साथ जुड़ा होता है:

// [[Rcpp::export]]

sourceCpp() माध्यम से C ++ फ़ाइल में पढ़ते समय सीधे घोषित फ़ंक्शन हेडर के ऊपर रखा जाता है।

नीचे बाहरी C ++ फ़ाइल का एक उदाहरण है जो विशेषताओं का उपयोग करता है।

// Add code below into C++ file Rcpp_example.cpp

#include <Rcpp.h>
using namespace Rcpp;

// Place the export tag right above function declaration.
// [[Rcpp::export]]
double muRcpp(NumericVector x){

    int n = x.size(); // Size of vector
    double sum = 0; // Sum value

    // For loop, note cpp index shift to 0
    for(int i = 0; i < n; i++){
        // Shorthand for sum = sum + x[i]
        sum += x[i];
    }

    return sum/n; // Obtain and return the Mean
}

// Place dependent functions above call or
// declare the function definition with:
double muRcpp(NumericVector x);

// [[Rcpp::export]]
double varRcpp(NumericVector x, bool bias = true){

    // Calculate the mean using C++ function
    double mean = muRcpp(x);
    double sum = 0;

    int n = x.size();

    for(int i = 0; i < n; i++){
        sum += pow(x[i] - mean, 2.0); // Square
    }

    return sum/(n-bias); // Return variance
}

R के भीतर इस बाहरी C ++ फ़ाइल का उपयोग करने के लिए, हम निम्नलिखित कार्य करते हैं:

require(Rcpp)

# Compile File
sourceCpp("path/to/file/Rcpp_example.cpp")

# Make some sample data
x = 1:5

all.equal(muRcpp(x), mean(x))
## TRUE

all.equal(varRcpp(x), var(x))
## TRUE

प्लगइन्स के साथ Rcpp का विस्तार

C ++ के भीतर, कोई भी विभिन्न संकलन झंडे का उपयोग कर सेट कर सकता है:

 // [[Rcpp::plugins(name)]]

अंतर्निहित प्लगइन्स की सूची:

// built-in C++11 plugin
// [[Rcpp::plugins(cpp11)]]

// built-in C++11 plugin for older g++ compiler
// [[Rcpp::plugins(cpp0x)]]

// built-in C++14 plugin for C++14 standard
// [[Rcpp::plugins(cpp14)]]

// built-in C++1y plugin for C++14 and C++17 standard under development
// [[Rcpp::plugins(cpp1y)]]

// built-in OpenMP++11 plugin
// [[Rcpp::plugins(openmp)]]

अतिरिक्त बिल्ड निर्भरता निर्दिष्ट करना

Rcpp पारिस्थितिकी तंत्र के भीतर अतिरिक्त पैकेजों का उपयोग करने के लिए, सही हेडर फ़ाइल Rcpp.h नहीं हो Rcpp.h लेकिन Rcpp<PACKAGE>.h ( जैसे RcppArmadillo के लिए )। इसे आम तौर पर आयात करने की आवश्यकता होती है और फिर निर्भरता के भीतर बताया जाता है

// [[Rcpp::depends(Rcpp<PACKAGE>)]]

उदाहरण:

// Use the RcppArmadillo package
// Requires different header file from Rcpp.h
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]

// Use the RcppEigen package
// Requires different header file from Rcpp.h
#include <RcppEigen.h>
// [[Rcpp::depends(RcppEigen)]]


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow