moving onto returning a data.frame?
On Tue, 20 May 2003, Jeff D. Hamann wrote:
Does anyone have a good example (from some of the packages?) for returning a data.frame. I'm trying to start my function so that it takes a data.frame as an argument and returns a data.frame (post-hocus-pocus).
read.dta in the foreign package springs to mind since I updated it yesterday. There are probably many others.
Here's my function so far...
SEXP testfunction3(
SEXP m_in )
{
int *mdims, n, p, i;
double *mm;
SEXP m_out;
SEXP nms;
if( !isMatrix( m_in ) )
{
error("m_in must be a matrix");
}
mdims = INTEGER( GET_DIM( m_in ) );
n = mdims[0];
p = mdims[1];
PROTECT( m_out = NEW_NUMERIC( p ) );
You are creating a vector of p reals here, not a data frame. If you know
the input and output have the same sizes and types it might be easiest to
use
m_out = duplicate(m_in)
though this is not maximally efficient.
PROTECT( m_in = AS_NUMERIC( m_in ) );
PROTECT( nms = GET_COLNAMES( GET_DIMNAMES( m_in ) ) );
/* here you'll disect the incoming data.frame into the vectors you'll
pass into your simulation code */
/* get the vectors based on the column names to make sure the sequence
isn't important */
/* crunch, crunch, crunch */
/* assign the results into the outgoing data.frame which will have the
same dimensions as the incoming frame */
if( !isNull( nms ) )
{
namesgets( m_out, nms );
}
UNPROTECT( 3 );
return m_out;
}
-thomas Thomas Lumley Asst. Professor, Biostatistics tlumley at u.washington.edu University of Washington, Seattle