كيف يمكنني إنشاء قائمة من المتجهات في RCPP؟

StackOverflow https://stackoverflow.com/questions/3088650

  •  28-09-2019
  •  | 
  •  

سؤال

أنا أكتب وحدة RCPP التي أرغب في العودة كعنصر واحد في قائمة RCPPResultset قائمة بعناصرها متجهات. على سبيل المثال ، .Call("myfunc")$foo يجب أن يكون شيئًا مثل:

[[1]]
[1] 1

[[2]]
[1] 1 1

[[3]]
[1] 1 1 1

(الأرقام الدقيقة ليست مهمة هنا). المشكلة هي أنني لا أعرف طريقة RCPP الصحيحة للقيام بذلك. حاولت تمرير أ vector<vector<int> > ولكن هذا يبني مصفوفة عن طريق أخذ بصمت طول المتجه الأول كعرض (حتى لو كانت المصفوفة خشنة!). لقد حاولت بناء RcppList ولكن تواجه صعوبة في إلقاء الأشياء المختلفة (مثل RcppVector) بأمان في SEXPس.

أي شخص لديه نصائح حول أفضل الممارسات للتعامل مع الهياكل المعقدة مثل قوائم المتجهات في RCPP؟

هل كانت مفيدة؟

المحلول

من الجيد رؤية هذا هنا ولكن رومان وأنا أوصي عمومًا RCCP-Devel قائمة للسؤال. يرجى نشرها إلى الأمام لأن المشروع ليس بعد أن يستدعي أن يكون هناك أسئلة منتشرة في جميع أنحاء الويب.

RcppResultSet هو جزء من الأكبر سنا كلاسيكي API في حين أن الكثير من العمل قد ذهب إلى ما نسميه الجديد API (بدءا من 0.7.* الإصدارات). ألق نظرة على التيار صفحة RCPP على CRAN وقائمة المقالات القصيرة - ستة والعد.

مع واجهة برمجة التطبيقات الجديدة ستعيد شيئًا مثل

return Rcpp::List::create(Rcpp::Named("vec") = someVector,
                          Rcpp::Named("lst") = someList,
                          Rcpp::Named("vec2") = someOtherVector);

الكل في بيان واحد (وربما باستخدام صريح Rcpp::wrap() المكالمات) ، إنشاء ما في ص سيكون

list(vec=someVector, lst=someList, vec2=someOtherVector)

و Rcpp::List يجب أن تكون قادرًا أيضًا على القيام بقوائم قوائم القوائم ... على الرغم من أنني لست متأكدًا من اختبارات الوحدة لهذا --- ولكن هناك العديد من الأمثلة في اختبارات الوحدة 500+.

كما يحدث ، قضيت الأيام القليلة الماضية في تحويل الكثير من Rquantlib رمز من واجهة برمجة التطبيقات الكلاسيكية إلى واجهة برمجة التطبيقات الجديدة. من المحتمل أن يتم إصدار هذا بمجرد الحصول على الإصدار 0.8.3 من RCPP خارج (نأمل في بضعة أيام). في غضون ذلك ، يمكنك إلقاء نظرة على Rquantlib SVN أرشيف

نصائح أخرى

أود أن أميل إلى استخدام تباين مضغوط لحل Dirk:

using namespace Rcpp ;
return List::create( 
   _["vec"]  = someVector, 
   _["lst"]  = someList, 
   _["vec2"] = someOtherVector
 ) ;

أيضا ، للعودة إلى السؤال الأصلي ، vector< vector<int> > يجب أن تلتزم نفسها بقائمة من ناقلات عدد صحيح ، وليس مصفوفة. نرى:

require( Rcpp )
require( inline )
require( RUnit )

fx <- cxxfunction( , '

    std::vector< std::vector<int> > v ;

    std::vector<int> x1(1) ; v.push_back( x1 );
    std::vector<int> x2(2) ; v.push_back( x2 );
    std::vector<int> x3(3) ; v.push_back( x3 );

    return wrap( v ) ;

', plugin = "Rcpp" ) 

انا حصلت :

> fx() 

[[1]]
[1] 0

[[2]]
[1] 0 0

[[3]]
[1] 0 0 0
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top