如何检查 Rcpp List 对象中是否存在名称?

How to check if a name exists in Rcpp List object?

是否可以检查传递给 Rcpp 函数的列表对象中是否存在名称?

在 base R 中,这可以通过以下方式检查:

"a" %in% names(foo)

虽然注意到这种方法的困难 (here)。 Rcpp 函数是否有等效的方法?谢谢

这是一个非常简单的第一关。您也可以使用字符串向量的 STL 成员进行匹配等等。

代码

#include <Rcpp.h>                                                                                                                                             
                                                                                                                                                              
// [[Rcpp::export]]                                                                                                                                           
bool contains(std::string s, Rcpp::List L) {                                                                                                                  
    Rcpp::CharacterVector nv = L.names();                                                                                                                     
    for (int i=0; i<nv.size(); i++) {                                                                                                                         
        if (std::string(nv[i]) == s) {                                                                                                                        
            return true;                                                                                                                                      
        }                                                                                                                                                     
    }                                                                                                                                                         
    return false;                                                                                                                                             
}                                                                                                                                                             
                                                                                                                                                              
/*** R                                                                                                                                                        
l <- list(aa="a", bb=1.23, cc=LETTERS[1:4])                                                                                                                   
contains("aaa", l) # false                                                                                                                                    
contains("bb", l)  # true                                                                                                                                     
*/

输出

 > Rcpp::sourceCpp("~/git/Whosebug/68397853/answer.cpp")                                                                                                 
                                                                                                                                                              
 > l <- list(aa="a", bb=1.23, cc=LETTERS[1:4])                                                                                                                
                                                                                                                                                              
 > contains("aaa", l) # false                                                                                                                                 
 [1] FALSE                                                                                                                                                    
                                                                                                                                                              
 > contains("bb", l)  # true                                                                                                                                  
 [1] TRUE                                                                                                                                                     
 >    

隐隐约约的感觉以前可能回答过类似的问题,and/or写过类似的辅助函数。无论如何,做一个简单的大约需要一分钟,所以如果有疑问就去做