.Call and data frames
Hin-Tak Leung wrote:
I think you want
else if (TYPEOF(colData) == STRSXP)
... instead.
I don't know if this will convert from factors to string's,
but somewhere it probably involves something like this:
PROTECT(colData = coerceVector(colData, STRSXP));
FWIW, a factor consists of all these things internally:
(1) TYPEOF(colData) is INTSXP
(2) attr(colData, "levels") exists and is a STRSXP type
(string representation for the levels).
(3) class(colData) = "factor"
if coerVector() doesn't do it, you can test for (3) in your C code,
and use the integer vector in (1) to index into the string vector in (2)
to regenerate the string vector manually.
Not all of this is correct, just an idea:
class = getAttrib(colData, R_ClassSymbol);
...
if (.../* do some test on class */...)
{
levels = getAttrib(colData, "levels");
PROTECT(back_to_str = allocVector(STRSXP, LENGTH(colData));
for(int i = 0; i < LENGTH=(colData) ; i++)
{
SET_STRING_ELT(back_to_str, i,
mkChar(STRING_ELT(levels, INTEGER(colData)[i])));
}
}
Dominick Samperi wrote:
Hello,
I'm trying to fetch a data frame through the C API,
and have no problem doing this when all columns
are numbers, but when there is a column of
strings I have a problem. On the C-side the
function looks like:
SEXP myfunc(SEXP df),
and it is called with a dataframe from
the R side with:
.Call("myfunc", somedataframe)
On the C side (actually C++ side) I use code
like this:
SEXP colnames = getAttrib(df, R_NamesSymbol)
cname = string(CHAR(STRING_ELT(colnames,i))
SEXP coldata = VECTOR_ELT(df,i) (data for i-th column)
if(isReal(colData))
x = REAL(colData)[j];
else if(isInteger(colData))
i = INTEGER(colData)[j];
else if(isString(colData))
s = CHAR(STRING_ELT(colData,j))
The problem is that the last test (isString) never passes,
even when I pass in a frame for which one or more cols
contain character strings. When the column contains
strings the isVector(colData) test passes, but no matter
how I try to fetch the string data I get a seg fault. That
is, forcing CHAR(STRING_ELT(colData,j)) will
fault, and so will VECTOR_ELT(colData,0), even
though colData passes the isVector test.
Any ideas?
Thanks,
ds
______________________________________________ R-devel at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel
______________________________________________ R-devel at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel