From: Lauri L. <lau...@he...> - 2012-01-04 16:27:21
|
Good new year, I have a fuction called "reader" defined in struct called object in the swig file and I'm trying to %extend it as follows: struct object { %extend { reader( char *filename, char *format="auto") { ... } } }; This works at least for lua and Python. However in R the code that is generated looks like this: SWIGEXPORT SEXP R_swig_object_reader ( SEXP filename, SEXP format, SEXP s_swig_copy) { struct region_set *result = 0 ; char *arg1 = (char *) 0 ; char *arg2 = (char *) "auto" ; unsigned int r_nprotect = 0; SEXP r_ans = R_NilValue ; VMAXTYPE r_vmax = vmaxget() ; arg1 = (char *)(SWIG_strdup(CHAR(STRING_ELT(filename, 0)))); arg2 = (char *)(SWIG_strdup(CHAR(STRING_ELT(format, 0)))); result = (struct region_set *)region_set_reader(arg1,arg2); r_ans = SWIG_R_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_region_set, R_SWIG_EXTERNAL | 0 ); free(arg1); free(arg2); vmaxset(r_vmax); if(r_nprotect) Rf_unprotect(r_nprotect); return r_ans; } Clearly, the default value is not used, ever, even though it's resident in the C code. Moreover, when called from R, it demands an argument. So, the whole function definition has no default argument on R side. > r = object_reader("my_fancy_file") Error in .class1(object) : argument "format" is missing, with no default Calls: region_set_reader -> as -> .class1 On another note, there seems to be no %rcode which would be equivalent to %pythoncode and %rcode. Such thing would be very usable as well, not least to provide a working default argument version from R itself. However even that doesn't fix the issue for member functions as they cannot be altered in R for the whole class. A third issue I noticed is that returning an R_NilValue doesn't seem very simple from e.g. typemaps, as some code, somewhere, is trying to set attributes on the returned "object". Any help/insight is appreciated. - Lauri |