SWIG R 包装器未设置 class properly/Create 来自 C 内存指针的 R 对象

SWIG R wrapper not setting class properly/Create R object from C memory pointer

我有一个 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 class:

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

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

作为参考,initialiseParameters(最初拥有 _p_parameters 的函数)的最后几行是通过 .Call 调用本机 C 函数,然后将外部指针分配给 [=45 的新对象=] _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 classes 的各种 R 文档,但似乎没有任何内容可以阐明我在这里要做什么。

我们非常欢迎任何关于从哪里开始的建议或提供良好提示的教程。

请记住,C 代码不是我的(但在 GNU 下可以免费获得),我不是 C 程序员,只是略微精通 R。所以请保持温和:)

干杯。

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

我想我应该 post 我必须解决这个问题。至少我能为 'tumbleweed' 勋章做些什么哈哈。 我能找到的唯一解决方案是注释掉以下行:

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

在所有尝试创建 R 对象的函数中。 然后在函数调用时将生成的内存指针分配给 R 对象。 它很脏,但我不知道如何从内存指针创建对象(至少从函数本身内部)。 它似乎有效,所以我想它会起作用。