2013-09-28 19 views
3

我已经开始使用Rcpp,并且我正在通过Hadley的book/page here工作。 我想这些基础知识对我来说已经绰绰有余了,尽管我错过了某些方面,或者觉得这可能不那么基本:使用C++为任意R对象分配属性?

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

如:

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

    return out; 
} 

我明白我必须指定在C++中的类型,但我仍想知道是否是我所看到分配给任何[R对象的属性,我传递的方式... data.table中的settatr与C++一起使用,但似乎仅适用于类data.table的元素。有没有办法为每个R模式/类写入额外的功能?

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

+1

我不明白你的问题。 FWIW Rcpp画廊有一个关于设置属性的帖子,我已经写了一本关于Rcpp的书,所以... –

+0

对不起,不准确。幸运的是,哈德利设法猜测我的意思并回答了问题。这本书已经在购物车上了。尽管如此,急于立即启动和使用现有项目的东西让我问问题:)。我认为让我困惑的是很多示例都使用CharacterVector或NumericVector作为函数输出类型,而不是SEXP或RObject。 –

+0

所以你试图将“无论”(例如其他R对象)分配为属性?在这种情况下,你确实想通过SEXP/RObject去。大多数问题和问题都涉及到数字,所以这就是为什么他们会得到答案... –

回答

4

也许你想要类似的东西? 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) 

*/ 
+0

你也可以用'SEXP'代替'RObject'。总之,任何“可分配”作为“SEXP”都应该起作用,这反过来又是我们可以包装到“SEXP”中的任何东西。 –

+1

@DirkEddelbuettel SEXP和RObject有什么区别? – hadley

+1

一个由R Core定义在C头中,另一个定义在我们的C++头中。关于后者的好处是'as <>'和'wrap()'非常注意转化为前者。 –

0

原谅我enthusiam:这简直太神奇了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

+0

有没有办法让我的R列表中的模式? –

+0

我认为它会更干净'克隆()'创建一个副本,然后修改其他所有地方 – hadley

+0

看看https://gist.github.com/hadley/157b5314f03de838862a – hadley