使用C ++将属性分配给任意R对象?

时间:2013-09-28 16:44:07

标签: c++ r rcpp

我已经开始使用Rcpp,我正在通过Hadley的book / page here工作。 我想这些基础知识对我来说已经绰绰有余了,尽管我错过了某些方面或觉得这可能不那么基本了:

如何使用C ++将属性分配给任意R对象?

E.g:

// [[Rcpp::export]]
NumericVector attribs(CharacterVector x,NumericVector y) {
    NumericVector out = y;
    out.attr("my-attr") = x;

    return out;
}

我知道我必须在C ++中指定类型,但我仍然想知道是否有一种方法可以为我传递的任何R对象分配属性... 我已经看到settatr中的data.table与C ++一起工作,但似乎只适用于类data.table的元素。有什么办法可以为每个R模式/类编写一个额外的函数吗?

编辑:最终目的是加快为列表的每个元素分配属性。 我们之前有discussion here - 但到目前为止它没有涉及Rcpp(除了通过其他包使用它。)

2 个答案:

答案 0 :(得分:5)

也许你想要这样的东西? RObject是所有R对象的泛型类。请注意clone的使用,以免意外修改传入的对象。

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
CharacterVector set_attr(CharacterVector x, RObject y) {
  CharacterVector new_x = clone(x);
  new_x.attr("my-attr") = y;

  return new_x;
}


/*** R

x <- c("a", "b", "c")
set_attr(x, 1)
set_attr(x, "a")

attributes(x)

*/

答案 1 :(得分:0)

请原谅我的热情:Rcpp如何帮助一个绝对新手加速这样的代码真是太神奇了!

这就是为什么我试了一下虽然哈德利的回答完全涵盖了这个问题。我试图将此处给出的输入转换为更具体的adding attributes to a list of objects as fast as possible案例的解决方案。

即使我的代码可能远非完美,但我已经能够超越所有代码 讨论中建议的功能,包括data.table's setattr。我想这可能是因为我让C ++不仅要进行赋值,还要进行循环。

以下是示例和基准:

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
RObject fx(List x, CharacterVector y){

  int n = x.size();
  NumericVector new_el;  

   for(int i=0; i<n; i++) {
    new_el = x[i];
    new_el.attr("testkey") = y;
    x[i] = new_el;
    }
  return(x);
 }

enter image description here