From simon.urbanek at r-project.org  Fri Oct 14 15:29:20 2011
From: simon.urbanek at r-project.org (Simon Urbanek)
Date: Fri, 14 Oct 2011 09:29:20 -0400
Subject: [Rd] how to return a matrix of strings from c to R ?
In-Reply-To: <1318490454016-3900763.post@n4.nabble.com>
References: <1318490454016-3900763.post@n4.nabble.com>
Message-ID: <7C580604-2FA8-48AA-88B2-9D94C5096F5B@r-project.org>


On Oct 13, 2011, at 3:20 AM, Alok Jadhav wrote:

> I am a bit confused about usage of R internal functions. I am able to send a
> char vector from C to R but not sure on how to send a vector of strings etc.
> 
> My code looks like this.
> 
> <code>
> 
>                SEXP result =
> PROTECT(Rf_allocMatrix(STRSXP,s->n_rics,s->n_fields));
> 
> 		int i,j;
> 		for (i=0; i < s->n_rics; i++)
> 		{
> 			for (j=0; j < s->n_fields; j++)
> 			{
> 				std::string text = s->data[j][i];
> 				result[j][i] = R_alloc( text.length(), sizeof(char));
> 				//strcpy(result[j][i], text.c_str());
> 				SET_STRING_ELT(result[j][i],0,Rf_mkChar(text.c_str()));
> 			}
> 		}
> 
> //		memcpy(result,s->data.ref(),s->n_fields*s->n_rics*sizeof(200));
> 		UNPROTECT(1);
> 		return result;
> 
> </code>
> 
> Can someone please make me understand this usecase and how to resolve it?
> 

It's more simple than that:

int rows = s->n_rics, cols = s->n_fields;
SEXP result = PROTECT(Rf_allocMatrix(STRSXP, rows, cols));
for (int i = 0; i < rows; i++) for (int j = 0; j < cols; j++) 
	SET_STRING_ELT(result, i + j * rows, Rf_mkChar(s->data[j][i].c_str()));
UNPROTECT(1);
return result;

Cheers,
Simon



> thanks,
> Alok
> 
> --
> View this message in context: http://r.789695.n4.nabble.com/how-to-return-a-matrix-of-strings-from-c-to-R-tp3900763p3900763.html
> Sent from the R devel mailing list archive at Nabble.com.
> 
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
> 
> 



[Rd] how to return a matrix of strings from c to R ?
Simon Urbanek