3

我从 Rcpp 开始,我正在阅读 Hadley 的书/页面。我想这些基础知识对我来说已经绰绰有余了,尽管我错过了某些方面或感觉这可能不那么基础:

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

例如:

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

    return out;
}

我知道我必须在 C++ 中指定类型,但我仍然想知道是否有办法将属性分配给我传递的任何 R 对象......我已经settatrdata.table使用 C++ 时看到了这一点,但似乎只适用于元素类data.table。除了为每个 R 模式/类编写一个额外的函数之外,还有什么办法吗?

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

4

2 回答 2

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)

*/
于 2013-09-28T19:15:19.350 回答
0

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

这就是为什么我尝试了一下,尽管哈德利的回答完美地涵盖了这个问题。我试图将此处给出的输入转换为尽可能快地将属性添加到对象列表的更具体情况的解决方案。

尽管我的代码可能远非完美,但我已经能够胜过讨论中建议的所有函数,包括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);
 }

在此处输入图像描述

于 2013-09-29T13:43:10.513 回答