2017-08-24 76 views
0

我想生成下面的C函數R(編程語言)包裝:如何爲返回int *的C函數生成R封裝器?

int *test(void) 
{ 
    int i; 

    i = 1024; 

    return (int *) i; 
} 

爲了創建這個包裝,我使用痛飲具有以下接口:

%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 *)?

回答

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 - 模具是相當豐富的,有益的。

+0

感謝您的建議@Dirk。 SWIG呢? – user7698505

+1

你讀過我寫的第一句話嗎?我不知道,我懷疑許多其他人。在遙遠的過去,我已經使用了一次或兩次,但這些本地到R的軟件包對於R_的使用更具性能。 –