我正在使用R的.Call接口从R调用C函数。我传递的一些对象附加了自定义属性,我想从C访问这些属性,而不必将它们作为单独的参数传递给.Call
函数。
例如,考虑具有自定义字符串属性的实数的简单情况:
x <- 1
attr(x, "myname") <- "Abiel"
从C函数中获取“myname”属性的一种方法是将其作为单独的参数传递:
.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()
的所有示例都涉及预定义符号,例如getAttrib(x, R_DimSymbol)
。 This section描述了如何将自定义属性附加到您在C中创建的SEXP对象,而不是如何获取与传递给C函数的对象关联的自定义属性。
答案 0 :(得分:2)
您需要install
该符号查找表的属性。在5.9.4 (Attributes)的Writing R Extensions部分中没有使用getAttrib
的示例,但xts.h中有几个示例。
以下代码应评估为FALSE
。
SEXP test(SEXP x)
{
isNull(getAttrib(x, install("myname")));
}