【问题标题】:Get custom attributes on an R SEXP object when using .Call使用 .Call 时获取 R SEXP 对象的自定义属性
【发布时间】:2011-11-09 21:35:11
【问题描述】:

我正在使用 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() 函数来做到这一点;例如,下面这个函数的主线将评估为真,表示一个空值。

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

浏览 R 扩展编写手册对我没有多大帮助,因为 getAttrib() 的所有示例都涉及预定义的符号,例如 getAttrib(x, R_DimSymbol)This section 描述了如何将自定义属性附加到您在 C 中创建的 SEXP 对象,而不是如何获取与传递给 C 函数的对象关联的自定义属性。

【问题讨论】:

    标签: r


    【解决方案1】:

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

    下面的代码应该评估为FALSE

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

    【讨论】:

    • 谢谢约书亚。我能够使用 getAttrib(x, install("myname")) 让它工作
    猜你喜欢
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 2020-02-02
    • 1970-01-01
    相关资源
    最近更新 更多