如何在R的cpp11包中推入命名值?含向量及字符串变量场景
cpp11 中向量命名元素处理及动态名称推入方案
1. 向向量推入命名值的方法
cpp11 里的向量(如 writable::integer_vec、writable::double_vec 等)的元素名称是作为向量的整体属性存在的,而非像列表那样可以在单个元素推入时直接绑定名称。常用实现方式有两种:
方式一:先推入元素,再统一设置名称
先向向量中添加元素,再通过 names() 方法为整个向量设置对应位置的名称:
#include "cpp11.hpp" using namespace cpp11; [[cpp11::register]] writable::integer_vector create_named_vector() { writable::integer_vec vec; // 推入元素 vec.push_back(1); vec.push_back(2); vec.push_back(3); // 为每个元素设置对应名称 names(vec) = {"first", "second", "third"}; return vec; }
方式二:初始化时直接构建命名向量
如果元素和名称已知,可在初始化向量时通过命名参数直接构建:
writable::integer_vec vec = { {"first"_nm = 1}, {"second"_nm = 2}, {"third"_nm = 3} };
2. 使用字符串变量作为名称的推入操作
无论是列表还是向量,都可以用 cpp11::nm() 函数将字符串变量转换为命名标识,实现动态名称绑定:
列表的动态名称推入
#include "cpp11.hpp" using namespace cpp11; [[cpp11::register]] writable::list create_named_list() { writable::list lst; std::string dyn_name = "dynamic_element"; // 用nm()包裹字符串变量,实现动态命名推入 lst.push_back(nm(dyn_name) = 42); return lst; }
向量的动态名称处理
对于向量,可维护一个名称向量,动态添加名称后统一绑定:
#include "cpp11.hpp" using namespace cpp11; [[cpp11::register]] writable::double_vector create_dynamic_named_vec() { writable::double_vec vec; writable::character_vec vec_names; // 动态名称变量 std::string name_a = "var_a"; std::string name_b = "var_b"; // 推入元素和对应名称 vec.push_back(3.14); vec_names.push_back(name_a); vec.push_back(2.71); vec_names.push_back(name_b); // 绑定名称到向量 names(vec) = vec_names; return vec; }
如果是初始化时使用动态名称,也可直接结合 nm():
std::string dyn_name = "my_var"; writable::integer_vec vec = { nm(dyn_name) = 100 };
内容的提问来源于stack exchange,提问作者beerda
相关产品推荐
相关产品推荐

