मेरे पास निम्न नेस्टेड सूची है जिसे मैं आरसीपीपी का उपयोग करके लूप करना चाहता हूं:

nested_list <- list("a"=list("a_a","a_b","a_c"), 
                    "b"=list("b_a", "b_b", "b_c"))

यहाँ मेरा प्रयास है:

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


// [[Rcpp::export]]
CharacterVector names_get( Rcpp::List y ){
  return y.names() ;
}

// [[Rcpp::export]]
void output( Rcpp::List y ){

  for(const auto &i : names_get(y))
  {
    Rcpp::List tmp = y[std::string(i)];

    for(const auto &j : integer_names_get(tmp))
      std::cout << j << "\n";
}

यह ठीक संकलित करता है, लेकिन जब मैं इसे output(nested_list) के रूप में चलाता हूं तो मुझे त्रुटि मिलती है Error in output(nested_list) : not compatible with STRSXP

इस त्रुटि का क्या अर्थ है और यह कहाँ/क्यों दिखाई देती है?

2
N08 2 नवम्बर 2017, 12:39

2 जवाब

सबसे बढ़िया उत्तर

त्रुटि

मेरा मानना ​​है कि त्रुटि इसलिए हो रही है क्योंकि आप सबलिस्ट के नाम प्रिंट करने का प्रयास कर रहे हैं जब आपके सबलिस्ट में नाम नहीं हैं:

names(nested_list)
names(nested_list[[1]])
str(nested_list)

> names(nested_list)
[1] "a" "b"
> names(nested_list[[1]])
NULL
> str(nested_list)
List of 2
 $ a:List of 3
  ..$ : chr "a_a"
  ..$ : chr "a_b"
  ..$ : chr "a_c"
 $ b:List of 3
  ..$ : chr "b_a"
  ..$ : chr "b_b"
  ..$ : chr "b_c"

आपके पास दो सूचियों की एक सूची है, जिनमें से प्रत्येक में तीन अनाम तत्व हैं जो प्रत्येक लंबाई के एक वर्ण वेक्टर हैं।

आरकॉउट

एक असंबंधित लेकिन फिर भी महत्वपूर्ण मुद्दा यह है कि Rcpp का उपयोग करते समय, आपको वास्तव में cout के बजाय Rcout का उपयोग करना चाहिए; आरसीपीपी गैलरी से:

राइटिंग आर एक्सटेंशन्स मैनुअल, जो कि आर को विस्तारित करने के लिए दस्तावेज़ीकरण का स्वर्ण मानक प्रदान करता है, आउटपुट के लिए आरप्रिंटफ और आरईप्रिंटफ का उपयोग करने का दृढ़ता से सुझाव देता है (सी/सी ++ कोड से)। मुख्य कारण यह है कि ये R द्वारा बनाए गए सामान्य आउटपुट और एरर स्ट्रीम से मेल खाते हैं।

वास्तव में, R CMD चेक चलाते समय std::cout और std::cerr (जैसा कि मानक C++ कोड में सामान्य है) का उपयोग ध्वजांकित किया जाता है और CRAN पर अपलोड करते समय इसकी अनुमति नहीं दी जाती है।

Jelmer Ypma द्वारा एक प्रारंभिक पैच के लिए धन्यवाद, जिसे बाद में फिर से काम और विस्तारित किया गया है, हमारे पास Rcout (मानक आउटपुट के लिए) और Rcerr (मानक त्रुटि के लिए) डिवाइस हैं जो आउटपुट को रोकते हैं और इसे R पर रीडायरेक्ट करते हैं।

संशोधित कोड

यदि आप वास्तव में nested_list जैसी किसी वस्तु के साथ काम कर रहे हैं और "a_a" जैसे तत्वों को प्राप्त करने की आवश्यकता है, तो आप निम्न कोशिश कर सकते हैं (शायद सबसे सुंदर समाधान नहीं है, लेकिन काम पूरा हो जाता है):

#include <Rcpp.h>

using namespace Rcpp;

// [[Rcpp::export]]
void output(List x) {
    int n = x.size();
    for ( int i = 0; i < n; ++i ) {
        List sublist = x[i];
        int m = sublist.size();
        for ( int j = 0; j < m; ++j ) {
            CharacterVector sublist_element = sublist[j];
            Rcout << sublist_element << "\n";
        }
    }
}

जो, जब आपके उदाहरण ऑब्जेक्ट पर R से कॉल किया जाता है, तो निम्न देता है:

> output(nested_list)
"a_a"
"a_b"
"a_c"
"b_a"
"b_b"
"b_c"

हालाँकि, यदि आप वास्तव में एक नेस्टेड सूची के साथ काम कर रहे हैं, जिसके उपन्यासकारों के नाम निम्नलिखित हैं:

# Make a nested list with sub-element names:
nested_list2 <- list("a"=list("a_a"=1,"a_b"=2,"a_c"=3), 
                     "b"=list("b_a"=1, "b_b"=2, "b_c"=3))

आपके फ़ंक्शन ने मेरे लिए निम्न आउटपुट दिया (कोई त्रुटि नहीं):

a_a
a_b
a_c
b_a
b_b
b_c

लेकिन केवल जब मैंने एक टाइपो तय किया जहां आप names_get के बजाय integer_names_get को कॉल करते हैं और समाप्त होने वाले घुंघराले ब्रैकेट को छोड़ देते हैं।

3
duckmayr 2 नवम्बर 2017, 14:09

मेरे पास निम्नलिखित नेस्टेड सूची है जिसे मैं Rcpp का उपयोग करके लूप करना चाहता हूं

बस एक अधिक सुरुचिपूर्ण समाधान जोड़ने के लिए, आप इन फ़ंक्शन का उपयोग या तो नेस्टेड सूचियों के नाम या नेस्टेड सूचियों के तत्वों को प्रिंट करने के लिए कर सकते हैं:

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
void print_char_ele(List x) {
  for(auto sub_list : x)
    for(auto ele : List(sub_list)) 
      for(auto ele_i : CharacterVector(ele))
        Rcout << ele_i << '\n';
}

// [[Rcpp::export]]
void print_names(List x) {
  for(auto sub_list : x)
    for(auto nam : CharacterVector(List(sub_list).names())) 
      Rcout << nam << '\n';
}

यहाँ दो फ़ंक्शन का उपयोग करने का परिणाम है

nested_list <- list("a" = list("a_a" = "x" , "a_b" = "y" , "a_c" = "z" ), 
                    "b" = list("b_a" = "xx", "b_b" = "yy", "b_c" = "zz"))

print_char_ele(nested_list)
#R> x
#R> y
#R> z
#R> xx
#R> yy
#R> zz
print_names(nested_list)
#R> a_a
#R> a_b
#R> a_c
#R> b_a
#R> b_b
#R> b_c

इस त्रुटि का क्या अर्थ है और यह कहाँ/क्यों दिखाई देती है?

जैसा कि डकमायर ने उल्लेख किया है, आपके द्वारा प्रदान की गई सूची में कोई नाम नहीं है और आप integer_names_get नामक एक फ़ंक्शन का उपयोग करते हैं जो आप नहीं दिखाते हैं।

0
Benjamin Christoffersen 27 मई 2020, 12:16