Получить пользовательские атрибуты для объекта R SEXP при использовании .Call - PullRequest
1 голос
/ 10 ноября 2011

Я делаю вызовы функций C из R, используя интерфейс R .Call. К некоторым объектам, которые я передаю, прикреплены пользовательские атрибуты, и я хочу получить доступ к этим атрибутам из C, не передавая их в качестве отдельных аргументов функции .Call.

Например, рассмотрим простой случай действительного числа с пользовательским атрибутом строки:

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

Один из способов получить атрибут «myname» из функции C - это передать его в качестве отдельного аргумента:

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

Но я бы предпочел просто сделать

.Call("test", x)

и затем восстановите атрибут «myname» в функции C. Я не смог понять, как это сделать с помощью функции getAttrib(); например, основная строка этой функции ниже будет иметь значение true, указывая нулевое значение.

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

Сканирование руководства по написанию расширений R мне не очень помогло, так как все примеры getAttrib() включают предопределенные символы, такие как getAttrib(x, R_DimSymbol). В этом разделе описывается, как присоединить пользовательский атрибут к объекту SEXP, который вы создаете в C, а не как получить такой пользовательский атрибут, который связан с объектом, который передается в функцию C.

1 Ответ

2 голосов
/ 10 ноября 2011

Вам необходимо install атрибут для таблицы поиска символов. Нет примера использования getAttrib в разделе 5.9.4 (Атрибуты) из Запись расширений R , но есть несколько примеров в xts.h .

Приведенный ниже код должен быть равен FALSE.

SEXP test(SEXP x)
{
    isNull(getAttrib(x, install("myname")));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...