ধীর আর ফাংশনগুলিকে গতিতে সি কোড লিখতে কোথায় আমি শিখতে পারি? [বন্ধ]


115

আর এর সাথে ব্যবহারের জন্য সি কোড লিখতে শেখার সর্বোত্তম উত্স কোনটি? আমি আর এক্সটেনশনের সিস্টেম এবং বিদেশী ভাষার ইন্টারফেস বিভাগ সম্পর্কে জানি , তবে আমি এটি বেশ কঠিন বলে মনে করি। আর এর সাথে ব্যবহারের জন্য সি কোড লেখার জন্য ভাল সংস্থানগুলি (অনলাইন এবং অফলাইন উভয়) কী কী?

স্পষ্ট করার জন্য, আমি সি কোড লিখতে শিখতে চাই না, আমি কীভাবে আর এবং সি আরও ভালভাবে সংহত করতে শিখতে চাই উদাহরণস্বরূপ, আমি কীভাবে সি পূর্ণসংখ্যা ভেক্টর থেকে আর পূর্ণসংখ্যার ভেক্টরে রূপান্তর করব (বা বিপরীতে) বা সি স্কেলার থেকে আর ভেক্টর পর্যন্ত?

উত্তর:


71

ভাল আছে সেখানে পুরাতন উত্স ব্যবহার করুন, লুক! --- আর নিজেই প্রচুর পরিমাণে (খুব দক্ষ) সি কোডের সাথে অধ্যয়ন করতে পারে এবং সিআরএএন এর কয়েকশ প্যাকেজ রয়েছে, এমন কিছু লেখক আপনার বিশ্বাস করেন। এটি অধ্যয়ন এবং মানিয়ে নেওয়ার জন্য বাস্তব, পরীক্ষিত উদাহরণ সরবরাহ করে।

তবে জোশের সন্দেহ হওয়ার কারণে আমি সি ++ এর দিকে আরও ঝুঁকছি এবং সেজন্য আরসিপিপি । এটির প্রচুর উদাহরণ রয়েছে।

সম্পাদনা করুন: দুটি সহায়ক বই আমার কাছে পাওয়া গেল:

  • প্রথমটি হ'ল ভেনেবলস এবং রিপলির " এস প্রোগ্রামিং " যদিও এটি দাঁতে দীর্ঘ হয়ে চলেছে (এবং বছরের পর বছর ধরে ২ য় সংস্করণের গুজব রয়েছে)। তখন আর কিছুই ছিল না।
  • চেম্বারের দ্বিতীয় " ডেটা অ্যানালাইসিসের জন্য সফ্টওয়্যার " যা আরও সাম্প্রতিক এবং আরও ভাল আর-কেন্দ্রিক অনুভূতি রয়েছে - এবং সি এবং সি ++ উভয়ই প্রসারিত করার জন্য দুটি অধ্যায় উল্লেখ করা হয়েছে। এছাড়াও, জন আমাকে ডাইজেস্ট দিয়ে যা করেছে তার জন্য আমাকে ছড়িয়ে দিয়েছিল যাতে একাই ভর্তির মূল্য।

এটি বলেছিল, জন আরসিপ্পের (এবং অবদান রাখার) প্রতি আগ্রহী হয়ে উঠছে কারণ তিনি দেখতে পেয়েছেন যে R অবজেক্টস এবং সি ++ অবজেক্টের ( আরসিপ্পের মাধ্যমে ) মধ্যে ম্যাচটি খুব প্রাকৃতিক - এবং রেফারেন্সক্লাসগুলি সেখানে সহায়তা করে।

সম্পাদনা করুন 2: হ্যাডলি এর refocussed প্রশ্ন, আমি খুব দৃঢ়ভাবে আপনি সি বিবেচনা করতে অনুরোধ ++,। সি এর সাথে আপনার অনেক কিছুই করতে হবে এমন প্রচুর বয়লারপ্লেট বাজে কথা আছে যা খুব ক্লান্তিকর এবং খুব এড়ানো যায়আরসিপিপি-ভূমিকা ভিগনেটটি দেখুন । আর একটি সহজ উদাহরণ হ'ল এই ব্লগ পোস্টটি যেখানে আমি দেখিয়েছি যে প্রায় 10% পার্থক্য (র‌্যাডফোর্ড নীল উদাহরণগুলির মধ্যে একটিতে) চিন্তার পরিবর্তে আমরা সি ++ ( আউটসেটেড উদাহরণস্বরূপ কোনটি ) এর সাথে আশিগুণ বৃদ্ধি পেতে পারি

3 সম্পাদনা করুন: এতে জটিলতা রয়েছে যে আপনি সি ++ এর ত্রুটিগুলি চালাতে পারেন যা এটিকে হালকাভাবে রাখা, শক্ত করা খুব কঠিন। তবে আরসিপ্পিকে প্রসারিত করার পরিবর্তে এটি ব্যবহার করার জন্য আপনার খুব কমই এর প্রয়োজন হবে। এবং যখন এই খরচ অনস্বীকার্য, এটা দ্বারা পর্যন্ত গ্রস্ত হয় উপকার সহজ কোডের, কম boilerplate, কোনও রক্ষা / অরক্ষিত, কোন মেমরি ব্যবস্থাপনা ইত্যাদি পিপি। ডগ বেটস মাত্র গতকাল বলেছেন যে তিনি সি খুঁজে বের করে ++ এবং Rcpp আরো অনেক কিছু আর লেখা মত হতে সি ++ লেখার চেয়ে ওয়াইএমএমভি এবং সমস্ত কিছু।


আমি প্রত্যাশা করলাম আমি একটি "ব্যবহার আরসিপিপি" উত্তর পেয়ে যাব;) আপনি যদি সি এর পরিবর্তে সি ++ ব্যবহারের অসুবিধাগুলিটি উচ্চারণ করতে পারেন তবে এটি সত্যিই কার্যকর হবে একটি প্রধান হিসাবে মনে হয় যে সি ++ আরও জটিল যে সি - এটি ব্যবহার করা কঠিন করে তোলে? (বা অনুশীলনে আপনি সি ++ কোড লিখতে পারেন যা সি এর সাথে খুব মিলে যায়?) আমি আরও নতুন রেফারেন্স উপাদানের প্রশংসা করব যা নতুন ব্যবহারকারী যারা বিদ্যমান সি এপিআইয়ের সাথে পরিচিত নয় তাদের লক্ষ্য করে।
হ্যাডলি

2
সম্পাদনা 3 দেখুন এবং হ্যাঁ, আপনি পারেন । মায়াররা সি ++ কে 'চারটি দৃষ্টান্ত' ভাষা কল করে এবং আপনাকে চারটি ব্যবহার করতে হবে না। এটিকে 'আরও ভাল সি' হিসাবে ব্যবহার করা এবং আরকিপিকে আঠালো থেকে আর হিসাবে ব্যবহার করা পুরোপুরি ঠিক। কেউ আপনার উপর স্টাইল জোর করে না - এটি জাভা নয় ;-)
ডার্ক এডেলবুয়েটেল

@ ডার্ক: বিস্তৃতকরণের জন্য THX। এটি আমাদের অফিসে আগে প্রশ্ন উত্থাপন করেছিল, কারণ সি এখানে ++ এর পরিবর্তে সাধারণত ব্যবহৃত হয়। সি ওভার সি-এর ব্যবহার কখন উপকারী হবে বা আপনি কেবল "কখনই সি, সবসময় সি ++" বলবেন না?
জোরিস মেয়েস

হ্যাডলি: দুর্দান্ত আমরা আপনার মতামত খুব আগ্রহী হবে। দয়া করে rcpp-devel এ যোগ দিন এবং পিছনে থাকবেন না। আমরা জানি যে আমরা সংক্ষিপ্ত ডকুমেন্টেশন - তবে চোখের একটি তাজা সেট প্রচুর সাহায্য করতে পারে।
ডার্ক এডেলবুয়েটেল

6
@ হডলি এর মানে কি এই যে আমরা কিছু গতি উন্নতি আশা করতে পারি ggplot?
aL3xa

56

হ্যাডলি,

আপনি অবশ্যই সি ++ কোড লিখতে পারেন যা সি কোডের মতো।

আপনি সি ++ সি এর চেয়ে জটিল হওয়ার বিষয়ে কী বলছেন তা আমি বুঝতে পারি এটি যদি আপনি সবকিছু আয়ত্ত করতে চান তবে: অবজেক্টস, টেম্পলেটস, এসটিএল, টেম্পলেট মেটা প্রোগ্রামিং ইত্যাদি ... বেশিরভাগ লোকের এই জিনিসগুলির প্রয়োজন হয় না এবং কেবল অন্যের উপর নির্ভর করতে পারেন এটা। আরসিপিপি বাস্তবায়ন খুব জটিল, তবে কেবল আপনার ফ্রিজ কীভাবে কাজ করে তা আপনি জানেন না, এর অর্থ এই নয় যে আপনি দরজাটি খুলতে পারবেন না এবং তাজা দুধ ধরতে পারবেন না ...

আর-তে আপনার অনেক অবদানের মধ্যে, যা আমাকে আঘাত করে তা হ'ল আপনি আর কিছুটা ক্লান্তিকর (ডেটা ম্যানিপুলেশন, গ্রাফিক্স, স্ট্রিং ম্যানিপুলেটিও, ইত্যাদি ...) খুঁজে পান। আর এর অভ্যন্তরীণ সিপিআই দিয়ে আরও অনেক বিস্ময়ের জন্য প্রস্তুত থাকুন This এটি অত্যন্ত ক্লান্তিকর।

সময়ে সময়ে, আমি আর-এক্সটস বা আর-ইনস্ট ম্যানুয়ালগুলি পড়ি। এটি সাহায্য করে। তবে বেশিরভাগ সময়, যখন আমি সত্যিই কোনও বিষয়ে সন্ধান করতে চাই, আমি আর উত্সে যাই এবং উদাহরণস্বরূপ সাইমন দ্বারা লিখিত প্যাকেজগুলির উত্সেও (সেখানে সাধারণত শিখার জন্য প্রচুর পরিমাণ রয়েছে)।

আরসিপিপি এপিআই-র এই ক্লান্তিকর দিকগুলি দূরে সরাতে ডিজাইন করা হয়েছে।

আপনি আরও জটিল, অচল, ইত্যাদি ... কয়েকটি উদাহরণের ভিত্তিতে কী কী খুঁজে পান তা আপনি নিজেরাই বিচার করতে পারেন। এই ফাংশনটি সি এপিআই ব্যবহার করে একটি অক্ষর ভেক্টর তৈরি করে:

SEXP foobar(){
  SEXP ab;
  PROTECT(ab = allocVector(STRSXP, 2));
  SET_STRING_ELT( ab, 0, mkChar("foo") );
  SET_STRING_ELT( ab, 1, mkChar("bar") );
  UNPROTECT(1);
}

আরসিপিপি ব্যবহার করে আপনি একই ফাংশনটি লিখতে পারেন:

SEXP foobar(){
   return Rcpp::CharacterVector::create( "foo", "bar" ) ;
}

বা:

SEXP foobar(){
   Rcpp::CharacterVector res(2) ;
   res[0] = "foo" ;
   res[1] = "bar" ;
   return res ;
}

ডার্ক যেমন বলেছিলেন, বেশ কয়েকটি ভিগনেটের অন্যান্য উদাহরণ রয়েছে। আমরা সাধারণত লোকদের আমাদের ইউনিট পরীক্ষার দিকে নির্দেশ করি কারণ তাদের প্রত্যেকটি কোডের একটি খুব নির্দিষ্ট অংশ পরীক্ষা করে কিছুটা স্ব-বর্ণনামূলক।

আমি এখানে স্পষ্টতই পক্ষপাতদুষ্ট, তবে আমি আর এর সি সি এপিআই শিখার পরিবর্তে আরসিপিপি সম্পর্কে পরিচিত হওয়ার পরামর্শ দেব, এবং তারপরে কোনও কিছু অস্পষ্ট থাকলে বা আরসিপ্পের সাথে অযোগ্য মনে না হলে মেলিং তালিকায় আসি।

যাইহোক, বিক্রয় পিচ শেষ।

আমি অনুমান করি যে এগুলি নির্ভর করে আপনি শেষ পর্যন্ত কোন ধরণের কোড লিখতে চান depends

রোমাঁ


2
"আরসিপিপি এপিআই-র এই ক্লান্তিকর দিকগুলি দূরে সরাতে ডিজাইন করা হয়েছে" = ঠিক আমি যা খুঁজছি। ধন্যবাদ! যা সত্যিই দরকারী তা হ'ল সি এর সাথে পরিচিত এবং আরসিপিপি ব্যবহার করতে চায় এমন ব্যক্তির জন্য একটি ভি। সংক্ষিপ্ত সি ++ প্রাইমার হবে।
হ্যাডলি

সুন্দর, আরসিপ্পির ছোট্ট উদাহরণটি আমাকে বিক্রি করিয়েছে। আমি ধরে নিচ্ছি অ্যলএক্সএক্সএক্স এবং ইউএনপ্রোটেক্ট (1) হ্যান্ডেল করা হয় ঠিক কিভাবে স্মার্ট পয়েন্টাররা রিসোর্স পরিচালনা করে। অর্থাৎ আরআইআইআই আরসিপিপি ওভার ভ্যানিলা সি এপি ব্যবহার করে কোনও উল্লেখযোগ্য পারফরম্যান্স পেনাল্টি আছে কি?
jbremament

আমরা আরসিপিপি-পরিচয়ে একটি বেঞ্চমার্ক উদাহরণ (যা উত্স / ইনস্টলড প্যাকেজটিতেও রয়েছে) দিয়ে সম্বোধন করি। সংক্ষেপে, কোন জরিমানা।
ডার্ক এডেলবুয়েটেল

29

@ হ্যাডলি: দুর্ভাগ্যক্রমে, আপনাকে সি ++ শুরু করতে সহায়তা করার জন্য আমার মনে মনে নির্দিষ্ট সংস্থান নেই। আমি স্কট মেয়ার্সের বইগুলি থেকে এটি গ্রহণ করেছি (কার্যকর সি ++, আরও কার্যকর সি ++, ইত্যাদি ...) তবে এগুলি আসলে কোনও নয় যা পরিচিতি বলতে পারে।

আমরা প্রায় একচেটিয়াভাবে সি ++ কোড কল করতে। কল কলটি ব্যবহার করি। নিয়মটি যথেষ্ট সহজ:

  • সি ++ ফাংশন অবশ্যই একটি আর বস্তু ফেরত দিতে হবে। সমস্ত আর অবজেক্টগুলি এসএএক্সপি হয়।
  • সি ++ ফাংশনটি 0 থেকে 65 আর অবজেক্ট হিসাবে ইনপুট হিসাবে নেয় (আবার এসএক্সপি)
  • এটি অবশ্যই (সত্যই নয়, তবে আমরা এটি পরে সংরক্ষণ করতে পারি) সি লিঙ্কেজের সাথে ঘোষণা করা হবে, হয় বাহ্যিক "সি" বা আরসিপিএক্সপোর্ট উপনাম যা আরসিপিপি সংজ্ঞায়িত করেছে।

সুতরাং একটি। কল ফাংশনটি কিছু শিরোলেখ ফাইলটিতে এভাবে ঘোষিত হয়:

#include <Rcpp.h>

RcppExport SEXP foo( SEXP x1, SEXP x2 ) ;

এবং .cpp ফাইলে এর মতো প্রয়োগ করা হয়েছে:

SEXP foo( SEXP x1, SEXP x2 ){
   ...
}

আরসিপিপি ব্যবহার করার জন্য আর এপিআই সম্পর্কে আরও অনেক কিছু জানার নেই।

বেশিরভাগ লোক কেবল আরসিপ্পিতে সংখ্যার ভেক্টরগুলির সাথে ডিল করতে চান। আপনি এই সংখ্যাটিভেক্টর ক্লাস দিয়ে। একটি সাংখ্যিক ভেক্টর তৈরির বিভিন্ন উপায় রয়েছে:

আপনি আর থেকে নিচে থাকা একটি বিদ্যমান অবজেক্ট থেকে:

 SEXP foo( SEXP x_) {
    Rcpp::NumericVector x( x_ ) ;
    ...
 }

প্রদত্ত মান সহ :: স্ট্যাটিক ফাংশন তৈরি করে:

 Rcpp::NumericVector x = Rcpp::NumericVector::create( 1.0, 2.0, 3.0 ) ;
 Rcpp::NumericVector x = Rcpp::NumericVector::create( 
    _["a"] = 1.0, 
    _["b"] = 2.0, 
    _["c"] = 3
 ) ;

প্রদত্ত আকারের:

 Rcpp::NumericVector x( 10 ) ;      // filled with 0.0
 Rcpp::NumericVector x( 10, 2.0 ) ; // filled with 2.0

তারপরে একবার আপনার ভেক্টর হয়ে গেলে সবচেয়ে কার্যকর জিনিসটি এটি থেকে একটি উপাদান বের করা। এটি 0-ভিত্তিক ইনডেক্সিং সহ অপারেটরের সাথে [] করা হয়, সুতরাং উদাহরণস্বরূপ একটি সংখ্যাসূচক ভেক্টরের সমষ্টিগত মানগুলি এরকম কিছু হয়:

SEXP sum( SEXP x_ ){
   Rcpp::NumericVector x(x_) ;
   double res = 0.0 ;
   for( int i=0; i<x.size(), i++){
      res += x[i] ;
   }
   return Rcpp::wrap( res ) ;
}

তবে আরসিপিপি চিনির সাথে আমরা এখন আরও সুন্দরভাবে এটি করতে পারি:

using namespace Rcpp ;
SEXP sum( SEXP x_ ){
   NumericVector x(x_) ;
   double res = sum( x ) ;
   return wrap( res ) ;
}

যেমনটি আমি আগেই বলেছি, এটি নির্ভর করে আপনি কোন ধরণের কোড লিখতে চান তার উপর। লোকেরা যে প্যাকেজগুলিতে আরসিপ্পের উপর নির্ভর করে তাদের কী করে দেখুন, ভিগনেটগুলি পরীক্ষা করুন, ইউনিট পরীক্ষা করুন, মেলিং তালিকায় আমাদের কাছে ফিরে আসুন। আমরা সবসময় সাহায্য করে খুশি।


20

@ জব্র্যামেন্ট: ঠিক আছে। আরসিপিপি ক্লাসগুলি আরআইআই প্যাটার্নের কাছাকাছি কিছু প্রয়োগ করে। যখন কোনও আরসিপিপি অবজেক্ট তৈরি করা হয়, তখন আবর্জনা সংগ্রহকারী থেকে অন্তর্নিহিত আর অবজেক্ট (এসএক্সপি) সুরক্ষিত হয় তা নিশ্চিত করার জন্য কনস্ট্রাক্টর যথাযথ ব্যবস্থা গ্রহণ করেন। ধ্বংসকারী সুরক্ষা প্রত্যাহার করে। এটি আরসিপিপি-প্রবর্তন ভিগনেটে ব্যাখ্যা করা হয়েছে । অন্তর্নিহিত বাস্তবায়ন আর এপিআই ফাংশনগুলির উপর নির্ভর করে R_PreserveObject এবং R_ReleaseObject

সি ++ এনক্যাপসুলেশনের কারণে কার্যত পারফরম্যান্স পেনাল্টি রয়েছে। আমরা এটিকে অন্তত ইনলাইনিং ইত্যাদির সাথে রাখার চেষ্টা করি ... পেনাল্টিটি খুব কম, এবং আপনি কোডটি লেখার এবং বজায় রাখার জন্য যে সময়ের প্রয়োজন তা বিবেচনায় আনলে এটি প্রাসঙ্গিক নয়।

আরসিপিপি ক্লাস ফাংশন থেকে আর ফাংশন কল করা সরাসরি সি এপি-র সাথে সরাসরি কল করার চেয়ে ধীর হয়। এটি কারণ আমরা সতর্কতা অবলম্বন করি এবং ফাংশন কলটিকে একটি ট্রাইচ্যাচ ব্লকে মুড়িয়ে রাখি যাতে আমরা আর ত্রুটিগুলি ক্যাপচার করি এবং তাদের সি ++ ব্যতিক্রমগুলিতে উন্নীত করি যাতে তারা সি ++ তে স্ট্যান্ডার্ড ট্রাই / ক্যাচ ব্যবহার করে মোকাবেলা করতে পারে।

বেশিরভাগ লোকেরা ভেক্টর (বিশেষত সংখ্যাসূচক) ব্যবহার করতে চান এবং এই শ্রেণীর সাথে শাস্তি খুব কম small উদাহরণগুলি / কনভলভবেনমার্কস ডিরেক্টরিতে আর-এক্সটস থেকে কুখ্যাত কনভলিউশন ফাংশনের বিভিন্ন রূপ রয়েছে এবং উইগনেটের বেঞ্চমার্কের ফলাফল রয়েছে। দেখা যাচ্ছে যে আরকিপি এটি আরপিআই ব্যবহার করে এমন বেঞ্চমার্ক কোডের চেয়ে দ্রুত তৈরি করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.