मेरे पास निम्न नेस्टेड सूची है जिसे मैं आरसीपीपी का उपयोग करके लूप करना चाहता हूं:
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 जवाब
त्रुटि
मेरा मानना है कि त्रुटि इसलिए हो रही है क्योंकि आप सबलिस्ट के नाम प्रिंट करने का प्रयास कर रहे हैं जब आपके सबलिस्ट में नाम नहीं हैं:
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
को कॉल करते हैं और समाप्त होने वाले घुंघराले ब्रैकेट को छोड़ देते हैं।
मेरे पास निम्नलिखित नेस्टेड सूची है जिसे मैं 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
नामक एक फ़ंक्शन का उपयोग करते हैं जो आप नहीं दिखाते हैं।