SWIG R包装器没有正确设置类/从C内存指针创建R对象

时间:2015-03-16 10:52:05

标签: c r class object swig

我有一个SWIG生成的R包装器,它包含以下setClass操作:

setClass('_p_f_p_struct_parameters_p_struct_chromosome_p_struct_dataSet__double',
        prototype = list(parameterTypes = c('_p_parameters', '_p_chromosome', '_p_dataSet'),
                        returnType = '_p_f_p_struct_parameters_p_struct_chromosome_p_struct_dataSet__double'),
        contains = 'CRoutinePointer')

setClass('_p_f_p_struct_parameters_p_p_struct_chromosome_p_p_struct_chromosome_int_int__void',
        prototype = list(parameterTypes = c('_p_parameters', '_p_p_chromosome', '_p_p_chromosome', '_int', '_int'),
                        returnType = '_p_f_p_struct_parameters_p_p_struct_chromosome_p_p_struct_chromosome_int_int__void'),
        contains = 'CRoutinePointer')

这些操作似乎没有按预期运行。当我调用一个函数,其输出是_p_parameters对象的创建(上面定义)时,我收到以下错误:

Error in getClass(Class, where = topenv(parent.frame())) : 
  “_p_parameters” is not a defined class

因此,setClass似乎没有做到这一点。

我尝试通过以下方式手动设置_p_parameters类:

p_parameters<-setClass(Class="_p_parameters", representation = representation(ref = "externalptr"))

但这似乎不起作用,因为当我尝试修改其他参数(甚至通过内置函数打印参数)时终端崩溃并挂起。

作为参考,initialiseParameters中的最后一行(最初拥有_p_parameters的函数)通过​​.Call调用本机C函数,然后将外部指针分配给类_p_paramters的新对象,如下所示:

 ;ans = .Call('R_swig_initialiseParameters', numInputs, numNodes, numOutputs, arity, as.logical(.copy), PACKAGE='cgp');
  ans <- new("_p_parameters", ref=ans) ;

我已经阅读了关于new(),setClass,S3 / S4课程的各种R doc,但似乎没有什么能说明我在这里做的意思。

任何关于从哪里开始的建议或者能够提供良好预测的教程都是非常受欢迎的。

请记住,C代码不是我的(但是在GNU下是免费提供的),我不是C程序员,而且我只是在中等程度上对R非常熟练。所以请温柔:)

干杯。

PS:如果我通过.Call调用R终端中的函数它按预期工作(因此它似乎不会出现C函数错误)

1 个答案:

答案 0 :(得分:0)

我以为我应该发布我的解决方案。至少我可以做一个'风滚草'奖章哈哈。 我能找到的唯一解决方案是注释掉以下行:

ans <- new("_p_parameters", ref=ans) ;

在尝试创建R对象的所有函数中。 然后,在函数调用时将生成的内存指针分配给R对象。 它很脏,但我无法弄清楚如何从内存指针创建一个对象(至少从函数本身内部)。 它似乎有用,所以我猜它会这样做。