From: Matt H. <mat...@gm...> - 2014-08-07 13:28:59
|
Hi all, I'm interested in getting the R bindings working for the shogun machine learning library and I'm running into the problem that was discussed in this thread: http://sourceforge.net/p/swig/mailman/message/32022817/ I was able to modify one of the existing swig R examples so that it reproduces the error. Hopefully that will be helpful in finding the cause of the bug. If you untar the attached file into the swig/Examples/r directory and then run make in the directory that it creates, you should get the error: Error in validObject(.Object) : invalid class "_p_Coordinates" object: invalid object for slot "ref" in class "_p_Coordinates": got class "numeric", should be or extend class "externalptr" Calls: <Anonymous> ... f -> new -> initialize -> initialize -> validObject Execution halted I am just using a simple typemap to convert the Coordinates class into an R vector: class Coordinates; %typemap(out) Coordinates { double x = $1.x; double y = $1.y; Rf_protect( $result = Rf_allocVector(REALSXP, 2) ); REAL($result)[0]=x; REAL($result)[1]=y; Rf_unprotect(1); } This is being picked up in the generated c++ wrapper code: SWIGEXPORT SEXP R_swig_Shape_getCoordinates ( SEXP self, SEXP s_swig_copy) { <snip> arg1 = reinterpret_cast< Shape * >(argp1); result = (arg1)->getCoordinates(); { double x = (&result)->x; double y = (&result)->y; Rf_protect( r_ans = Rf_allocVector(REALSXP, 2) ); REAL(r_ans)[0]=x; REAL(r_ans)[1]=y; Rf_unprotect(1); } vmaxset(r_vmax); if(r_nprotect) Rf_unprotect(r_nprotect); return r_ans; } but the generated R code still thinks that it is receiving a pointer to a Coordinates object, rather than an R numeric vector: # Start of Shape_getCoordinates `Shape_getCoordinates` = function(self, .copy = FALSE) { if (inherits(self, "ExternalReference")) self = slot(self,"ref") ;ans = .Call('R_swig_Shape_getCoordinates', self, as.logical(.copy), PACKAGE='example'); ans <- new("_p_Coordinates", ref=ans); ans } attr(`Shape_getCoordinates`, 'returnType') = '_p_Coordinates' attr(`Shape_getCoordinates`, "inputTypes") = c('_p_Shape') class(`Shape_getCoordinates`) = c("SWIGFunction", class('Shape_getCoordinates')) Hopefully that's helpful! Matt |