2011-02-15 96 views
2

我正在试图为一些基于C的稀疏矩阵处理代码打包(请参阅previous question)。为了调用的主力C函数,我需要创建看起来像这样的结构:从R对象提取long []

struct smat { 
    long rows; 
    long cols; 
    long vals;  /* Total non-zero entries. */ 
    long *pointr; /* For each col (plus 1), index of first non-zero entry. */ 
    long *rowind; /* For each nz entry, the row index. */ 
    double *value; /* For each nz entry, the value. */ 
}; 

这些很好地对应于一个dgCMatrix稀疏矩阵的插槽。因此,理想情况下,我只需指向dgCMatrix中的内部数组(在验证C函数不会与数据混淆[我还没有完成]之后)。

对于*value,看起来我可以根据需要使用REALSXP或其他来获得double[]。但是对于*pointr*rowind,我不确定是否能找到合适的数组。我是否需要遍历条目并将它们复制到新数组中,并按照我的方式进行投射?或者Rcpp可以在这里提供一些糖吗?这是我第一次真正使用Rcpp,而且我还没有精通它。

谢谢。

编辑:我也有一些链接麻烦,我不明白:

Error in dyn.load(libLFile) : 
    unable to load shared object '/var/folders/TL/TL+wXnanH5uhWm4RtUrrjE+++TM/-Tmp-//RtmpAA9upc/file2d4606aa.so': 
    dlopen(/var/folders/TL/TL+wXnanH5uhWm4RtUrrjE+++TM/-Tmp-//RtmpAA9upc/file2d4606aa.so, 6): Symbol not found: __Z8svdLAS2AP4smatl 
    Referenced from: /var/folders/TL/TL+wXnanH5uhWm4RtUrrjE+++TM/-Tmp-//RtmpAA9upc/file2d4606aa.so 
    Expected in: flat namespace 
in /var/folders/TL/TL+wXnanH5uhWm4RtUrrjE+++TM/-Tmp-//RtmpAA9upc/file2d4606aa.so 

我需要要创建我的图书馆有一些特殊的编译标志?

编辑2:它看起来像我的libargs参数没有效果,因此libsvd符号永远不会将它放入库中。我能找到没有办法使用cxxfunction()包括图书馆 - 这里就是我想要尝试,但额外的参数(从cfunction()如意thinkingly借用)都默默地吞噬了:

fn <- cxxfunction(sig=c(nrow="integer", mi="long", mp="long", mx="numeric"), 
        body=code, 
        includes="#include <svdlib.h>\n", 
        cppargs="-I/Users/u0048513/Downloads/SVDLIBC", 
        libargs="-L/Users/u0048513/Downloads/SVDLIBC -lsvd", 
        plugin="Rcpp", 
        verbose=TRUE) 

我觉得我要去关于这整个过程是错误的,因为没有什么工作。任何人在正确的方向踢我?

回答

0

我已经做了[R]类似-Smalltalk接口的东西,去年,前往它更为通用,以能够使用字节数组传递所有的数据备份和反复:

在C I具有:

DLLIMPORT void getLengthOfNextMessage(byte* a); 
DLLIMPORT void getNextMessage(byte* a); 

在R:

getLengthOfNextMessage <- function() { 
    tmp1 <- as.raw(rep(0,4)) 
    tmp2<-.C("getLengthOfNextMessage", tmp1) 
    return(bvToInt(tmp2)) 
} 

receiveMessage <- function() { 
    #if(getNumberOfMessages()==0) { 
    # print("error: no messages") 
    # return(); 
    #} 
    tmp1<-as.raw(rep(0, getLengthOfNextMessage()+getSizeOfMessages())) 
    tmp2<-.C("getNextMessage", tmp1) 
    msg<-as.raw(tmp2[[1]]) 
     print(":::confirm received") 
     print(bvToInt(msg[13:16])) 
    # confirmReceived(bvToInt(msg[13:16])) 
    return(msg) 
} 

我已注释的使用功能getNumberOfMessages()和confirmReceived(),其是特定的问题,我不得不解决(多来回通信)。本质上,代码使用参数字节数组传输信息,首先是4字节长的信息,然后是实际数据。这看起来不太优雅(即使对我来说)比使用结构,但我发现它更通用,我可以挂钩到任何DLL,传输任何数据类型。