Skip to content

Capturing output of a C executable

7 messages · Dennis Fisher, Jeff Newmiller, jim holtman +4 more

#
R 3.0.1
OS X

Colleagues,

I am experimenting with incorporating C code into R.  After compiling the C code with: 
	R CMD SHLIB -o FILE.so FILE.c
and executing:
	dyn.load(?FILE.so?)
(without any errors), I execute the following R functions in a terminal window:
	READSAS 	<- function(sourcefile) .C("readsas", sourcefile) 
	OUTPUT 		<- READSAS("../SASFILES/sdrug.sas7bdat") 
R / C then reads a sas7bdat file and sends the contents to the terminal window.

I expected OUTPUT to contain the text that appear in the terminal window (i.e., the contents of the file).  But, that is not the case; OUTPUT contains:
	[[1]]
	[1] "../SASFILES/sdrug.sas7bdat"
It is not clear to my how to capture that appears in the terminal window.

Ultimately, I may need to modify the C code so that the output goes to a file, which I then read into R.  However, it would be better if I did not need to modify the C code.
Does anyone have any ideas of how I can capture this output within R?

Dennis

Dennis Fisher MD
P < (The "P Less Than" Company)
Phone: 1-866-PLessThan (1-866-753-7784)
Fax: 1-866-PLessThan (1-866-753-7784)
www.PLessThan.com
#
You really need to read the "Writing R Extensions" document. It warns you against performing I/O from C code linked to R.

You probably ought to read the Posting Guide, also, since this question is off topic here 
---------------------------------------------------------------------------
Jeff Newmiller                        The     .....       .....  Go Live...
DCN:<jdnewmil at dcn.davis.ca.us>        Basics: ##.#.       ##.#.  Live Go...
                                      Live:   OO#.. Dead: OO#..  Playing
Research Engineer (Solar/Batteries            O.O#.       #.O#.  with
/Software/Embedded Controllers)               .OO#.       .OO#.  rocks...1k
--------------------------------------------------------------------------- 
Sent from my phone. Please excuse my brevity.
On February 2, 2014 5:09:33 PM PST, Dennis Fisher <fisher at plessthan.com> wrote:
#
?sink

Jim Holtman
Data Munger Guru

What is the problem that you are trying to solve?
Tell me what you want to do, not how you want to do it.
On Sun, Feb 2, 2014 at 8:09 PM, Dennis Fisher <fisher at plessthan.com> wrote:
#
READSAS returns the value of .C(...), which returns a list of its arguments,
perhaps modified by the C function you called.  Thus you should expect
READSAS to return the filename you gave it (in a list).

Bill Dunlap
TIBCO Software
wdunlap tibco.com
#
On Feb 2, 2014, at 5:09 PM, Dennis Fisher wrote:

            
I wonder if this is a follow-up to the suggestion to look at ReadStat?: https://github.com/WizardMac/ReadStat

I could imagine calling it from R but then directing results to a comma separated file along the lines of the second example. If my guess is correct, you might assist the R community and get valuable advice by posting your source and Makefile on R-devel.
#
Dennis -
     The return value from .C will almost never be useful.  If you want to bring
results from the C environment into R, you need to do it by passing an address to
.C which will receive the result.
     You may find this document helpful when interfacing R to C:

          http://www.stat.berkeley.edu/classes/s243/calling.pdf

 					- Phil Spector
 					 Statistical Computing Facility
 					 Department of Statistics
 					 UC Berkeley
 					 spector at stat.berkeley.edu
On Sun, 2 Feb 2014, Dennis Fisher wrote:

            
#
On 14-02-03 5:44 PM, Phil Spector wrote:
Are you limiting this to the specific situation Dennis described, or 
making a more general claim?  The more general claim is clearly false.

Lots of packages return useful results using .C calls.  The idea is that 
all arguments to the C function are passed by reference and may be 
modified in place, so you just pass a vector to receive the result. 
That's equivalent to what you describe below, but I think it seems 
simpler, since "passing an address" from R sounds like an exotic 
operation, not the norm.

Duncan Murdoch

  If you want to bring