استرداد المعلمات من القائمة باستخدام Rcpp

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

  •  21-12-2019
  •  | 
  •  

سؤال

جديد في Rcpp أقوم باختبار كيفية استرداد واستخدام قائمة متداخلة من R ذات بنية معروفة دون نسخ أجزاء من القائمة مرة أخرى.يبدو أن مثال التعليمات البرمجية الصغيرة (مع رمز R المضمن) يعمل (يتم استخدام cout لتصحيح الأخطاء).

قد تكون قائمة rL المستردة من R كبيرة جدًا لذا لا أرغب في إعادة تخصيص الذاكرة (نسخ أجزاء من rL).هل يقوم الكود الحالي بنسخ أجزاء من rL؟

أفضل لارس

#include <Rcpp.h>
#include <iostream>
using namespace Rcpp;
using namespace std;

// [[Rcpp::export]]
SEXP testing(const List rL) {
   List L(rL);
   SEXP sL2(L["L2"]);
   List L2(sL2);

   SEXP sStateGrpL2(L2["stateGroups"]);
   List stateGrpL2(sStateGrpL2);
   SEXP sStateAllocL2(L2["stateAlloc"]);   
   CharacterVector stateAllocL2(sStateAllocL2);

   SEXP sActionGrpL2(L2["actionGroups"]);
   List actionGrpL2(sActionGrpL2);
   SEXP sActionAllocL2(L2["actionAlloc"]);
   List actionAllocL2(sActionAllocL2);

   vector<string> stateLabels; 
   vector<string> actionLabels;
   CharacterVector actionNames;

   for(int n2 = 0; n2< as<int>(L2["stages"]); n2++) {
      stateLabels = as< vector<string> >(stateGrpL2[as<string>(stateAllocL2[n2])]);
      int s2Size = stateLabels.size(); 
      SEXP sAllocA(actionAllocL2[n2]);
      List allocA(sAllocA);
      actionNames = as<CharacterVector>(allocA[0]);
      cout << "stage:" << n2 << " sN:" << as<string>(stateAllocL2[n2]) << "\n";
      for (int s2=0; s2<s2Size; ++s2) { 
        cout << " s:" << stateLabels[s2] << " aN:" << actionNames[s2] << "\n";
        actionLabels = as< vector<string> >(actionGrpL2[ as<string>(actionNames[s2]) ]);
        int a2Size = actionLabels.size();
        for (int a2=0; a2<a2Size; ++a2) {
           cout << "    a:" << actionLabels[a2] << "\n";
        }
      }
   }

   return wrap(0);
}


/*** R 
L <- list( L2=list(stages=2, 
                   stateGroups=list(s1Grp=c("a","b","c"),s2Grp=c("d","e")), 
                   stateAlloc = c(rep("s1Grp",1),rep("s2Grp",1)), 
                   actionGroups = list(a1Grp=c("terminate","keep"), a2Grp=c("finish")),
                   actionAlloc = list(list( rep("a1Grp",3) ),
                                       list( c("a1Grp","a2Grp") )
                                       )
                   )
     )
testing(L)
*/
هل كانت مفيدة؟

المحلول

انت تكتب:

قد تكون القائمة RL كبيرة جدًا لذا لا أريد استخدام ذاكرة جديدة (نسخة من أجزاء RL).هل هذا هو السبيل لتحقيق ذلك؟

إلى حد كبير (بقدر ما أستطيع أن أقول من نظرة سريعة على الكود الخاص بك).

كل التبادل مع استخدامات R SEXP أنواع حيث P يرمز إلى المؤشر - وهي كائنات وكيلة ضحلة والتي سوف لا يمكن نسخها.يستخدم/يعيد استخدام ذاكرة كائن R.

لذا، إذا قمت بإنشاء ملف تعريف/ملف تعريف للذاكرة، فيجب أن يتصرف بشكل مشابه بالنسبة لـ N=10 وN=1e5.لكن الدليل في الحلوى...

نصائح أخرى

بعض الأشياء:

  • اختبار الحلقة GuardCetagCode من الصعب قراءتها و غير فعال كما يتم حسابها في كل تكرار.يجب بالتأكيد تفعل ذلك مرة واحدة فقط.

  • جميع n2< as<int>(L2["stages"]) تخلق نسخا عميقة ولا استفد من ذاكرة التخزين المؤقت السلسلة R.لا يمكنك استخدام as< vector<string> > بدلا من ذلك؟

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