From dsamperi at DecisionSynergy.com  Thu Jun 22 07:07:52 2006
From: dsamperi at DecisionSynergy.com (Dominick Samperi)
Date: Thu, 22 Jun 2006 01:07:52 -0400
Subject: [Rd] .Call and data frames
Message-ID: <449A25A8.1070108@DecisionSynergy.com>

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



[Rd] .Call and data frames
Dominick Samperi