如何为返回int *的C函数生成R包装器?

时间:2017-08-24 19:21:27

标签: c r swig

我想为以下C函数生成一个R(编程语言)包装器:

int *test(void)
{
    int i;

    i = 1024;

    return (int *) i;
}

要创建此包装器,我使用带有以下界面的SWIG:

%module X
%{
    extern int *test(void);
%}
extern int *test(void);

我可以成功创建和编译这个包装器。但是,当我运行以下R代码(预先加载包装器)时:

print(test())

会出现以下错误:

Error in getClass(Class, where = topenv(parent.frame())) : 
  “_p_int” is not a defined class
Calls: print -> test -> new -> getClass

我的问题如下:如何包装C test函数(更确切地说是此函数返回的int *)?

1 个答案:

答案 0 :(得分:0)

SWIG并没有在R周围广泛使用。但是inline包可以帮助你。

R> library(inline)
R> foo <- cfunction(signature(i="int"), body="*i = 1024;",
+                   language="C", convention=".C")
R> foo(12)$i
[1] 1024
R> 

那就是说,你可能想要.Call()而不是.C(),你应该调查Rcpp,即使你想使用普通的C - 工具也非常丰富和有用