Merge pull request #645 from richardbeare/RCharacterVectorSupport
R character vector support
This commit is contained in:
commit
bddf4892c4
3 changed files with 60 additions and 2 deletions
|
|
@ -130,3 +130,13 @@ namespace aa {
|
||||||
std::vector< ::aa::Holder > vec1(std::vector< ::aa::Holder > x) { return x; }
|
std::vector< ::aa::Holder > vec1(std::vector< ::aa::Holder > x) { return x; }
|
||||||
%}
|
%}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// exercising vectors of strings
|
||||||
|
%inline %{
|
||||||
|
std::vector<std::string> RevStringVec (const std::vector<std::string> &In)
|
||||||
|
{
|
||||||
|
std::vector<std::string> result(In);
|
||||||
|
std::reverse(result.begin(), result.end());
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
%}
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,10 @@ testvec <- c(1, 2, 3)
|
||||||
|
|
||||||
unittest(half(testvec), testvec/2)
|
unittest(half(testvec), testvec/2)
|
||||||
unittest(average(testvec), mean(testvec))
|
unittest(average(testvec), mean(testvec))
|
||||||
|
## string vector test
|
||||||
|
vlen <- 13
|
||||||
|
stringvec <- paste(letters[1:vlen], as.character(rnorm(vlen)))
|
||||||
|
unittest(rev(stringvec), RevStringVec(stringvec))
|
||||||
q(save="no")
|
q(save="no")
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -192,7 +192,6 @@
|
||||||
}
|
}
|
||||||
UNPROTECT(1);
|
UNPROTECT(1);
|
||||||
return(result);
|
return(result);
|
||||||
//return SWIG_R_NewPointerObj(val, type_info< std::vector<T > >(), owner);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -208,7 +207,6 @@
|
||||||
}
|
}
|
||||||
UNPROTECT(1);
|
UNPROTECT(1);
|
||||||
return(result);
|
return(result);
|
||||||
//return SWIG_R_NewPointerObj(val, type_info< std::vector<T > >(), owner);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -516,6 +514,31 @@
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct traits_asptr < std::vector<std::basic_string<char> > > {
|
||||||
|
static int asptr(SEXP obj, std::vector<std::basic_string<char> > **val) {
|
||||||
|
std::vector<std::basic_string<char> > *p;
|
||||||
|
// R character vectors are STRSXP containing CHARSXP
|
||||||
|
// access a CHARSXP using STRING_ELT
|
||||||
|
int sexpsz = Rf_length(obj);
|
||||||
|
p = new std::vector<std::basic_string<char> >(sexpsz);
|
||||||
|
SEXP coerced;
|
||||||
|
PROTECT(coerced = Rf_coerceVector(obj, STRSXP));
|
||||||
|
//SEXP *S = CHARACTER_POINTER(coerced);
|
||||||
|
for (unsigned pos = 0; pos < p->size(); pos++)
|
||||||
|
{
|
||||||
|
const char * thecstring = CHAR(STRING_ELT(coerced, pos));
|
||||||
|
(*p)[pos] = std::basic_string<char>(thecstring);
|
||||||
|
}
|
||||||
|
int res = SWIG_OK;
|
||||||
|
if (SWIG_IsOK(res)) {
|
||||||
|
if (val) *val = p;
|
||||||
|
}
|
||||||
|
UNPROTECT(1);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// catchall for R to vector conversion
|
// catchall for R to vector conversion
|
||||||
template <typename T>
|
template <typename T>
|
||||||
struct traits_asptr < std::vector<T> > {
|
struct traits_asptr < std::vector<T> > {
|
||||||
|
|
@ -846,6 +869,27 @@
|
||||||
%typemap("rtype") std::vector<int> "integer"
|
%typemap("rtype") std::vector<int> "integer"
|
||||||
%typemap("scoercein") std::vector<int> , std::vector<int> const, std::vector<int> const& "$input = as.integer($input);";
|
%typemap("scoercein") std::vector<int> , std::vector<int> const, std::vector<int> const& "$input = as.integer($input);";
|
||||||
|
|
||||||
|
// strings
|
||||||
|
%typemap("rtype") std::vector< std::basic_string<char> >,
|
||||||
|
std::vector< std::basic_string<char> > *,
|
||||||
|
std::vector< std::basic_string<char> > & "character"
|
||||||
|
|
||||||
|
%typemap("rtypecheck") std::vector< std::basic_string<char> >,
|
||||||
|
std::vector< std::basic_string<char> > *,
|
||||||
|
std::vector< std::basic_string<char> > &
|
||||||
|
%{ is.character($arg) %}
|
||||||
|
|
||||||
|
%typemap("scoercein") std::vector< std::basic_string<char> >,
|
||||||
|
std::vector< std::basic_string<char> > *,
|
||||||
|
std::vector< std::basic_string<char> > & "$input = as.character($input);";
|
||||||
|
|
||||||
|
%typemap("scoerceout") std::vector< std::basic_string<char> >,
|
||||||
|
std::vector< std::basic_string<char> > *,
|
||||||
|
std::vector< std::basic_string<char> > &
|
||||||
|
%{ %}
|
||||||
|
|
||||||
|
%apply std::vector< std::basic_string<char> > { std::vector< std::string> };
|
||||||
|
|
||||||
// all the related integer vectors
|
// all the related integer vectors
|
||||||
// signed
|
// signed
|
||||||
%typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector<signed char>);
|
%typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector<signed char>);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue