Я делаю вызовы функций 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.