2011-11-09 43 views
1

。我传递的一些对象具有附加到它们的自定义属性,我想从C访问这些属性,而不必将它们作为单独的参数传递给.Call函数。使用.Call时获取R SEXP对象上的自定义属性使用R的.Call接口从R调用R函数调用C函数

例如,考虑实数的简单情况下使用自定义字符串属性:

x <- 1 
attr(x, "myname") <- "Abiel" 

一种方式在“MYNAME”属性从内C函数是把它作为一个独立的获得参数:

.Call("test", x, as.character(attr(x, "myname"))) 

但是,我宁愿只是做

.Call("test", x) 

,然后恢复C函数中的“myname”属性。我一直无法弄清楚如何用getAttrib()函数来做到这一点;例如,下面这个函数的主线将计算为true,表示一个空值。

SEXP test(SEXP x) 
{ 
    isNull(getAttrib(x, mkChar("myname"))); 
} 

扫描将R写入扩展手动并没有帮助我很多,为getAttrib()所有的例子包括预定义的符号,如​​。 This section描述了如何将自定义属性附加到您在C中创建的SEXP对象,但不知道如何获得与传递到C函数中的对象关联的自定义属性。

回答

2

您需要将install属性添加到符号查找表中。在Writing R Extensions5.9.4 (Attributes)部分中没有使用getAttrib的示例,但xts.h中有几个示例。

以下代码应评估为FALSE

SEXP test(SEXP x) 
{ 
    isNull(getAttrib(x, install("myname"))); 
} 
+0

谢谢约书亚。我能够得到这个工作使用getAttrib(x,安装(“myname”)) – Abiel