Skip to content

Calling R in BATCH mode from C programm

3 messages · Brian Ripley, alkatz@post.tau.ac.il

#
Hello R-people,

I have the following problem :

In order to run R script from DOS prompt in BATCH mode and pass it some
parameters I do the following :


Rterm --slave --no-save --no-restore <args.R> args.out ARG1=1 ARG2=2

It works fine :
the result is that the script args.R is isexecuted. Sys.getenv() sees the 
arguments ARG1 and ARG2, and the R creates output file args.out


Now I want to be able to call the same command from C application :


#include <conio.h>
#include <process.h>
#include <string.h>


void main()
{
   char *args[10], prog[80];
   int ch;

   strcpy(prog, "C:\\Program Files\\R\\RBase\\bin\\Rterm.exe "); 

   /* Arguments to Rterm.exe */
   args[0] = "--slave";
   args[1] = "--no-save";
   args[2] = "--no-restore";
   args[3] = "<args.R>";
   args[4] = "args.out";
   args[5] = "ARG1=1"; 
   args[6] = "ARG2=2";
   args[7] = NULL;
   

   _execl( prog, args[0], args[1], args[2], args[3], args[4], args[5], args[6], 
NULL);
}


Rterm starts, but writes to output :

ARGUMENT '<args.R>' __ignored__
ARGUMENT 'args.out' __ignored__


Command Sys.getenv("ARG1") returns correct result => R sees the rest of the 
arguments.

I tryed to type args[3] = "args.R" - without <> it does not help.

Does enyone know what might be my problem ??

Thanks,
Alex.
#
to redirect stderr).  I'll leave you to fathom that out (but as you are on
Windows, the R sources should give you many useful clues).  (Note that you 
do actually need a stdin and stdout to redirect, and a Windows application 
does not necessarily have them set up.)
On Tue, 20 May 2003 alkatz at post.tau.ac.il wrote:

            
That is actually <args.R >args.out: whether your form works depends on the 
OS and shell.  The effect is to redirect stdin/stdout and is done either 
by the shell or by the C initialization code.

  
    
#
Dear, Prof. Repley,

thank you for the help,
of course, you are right. 

Redirection of stdin, stdout, stderr does the job.

If R script saves and reloads apprpriate workspaces,
then this method may be used instead of calling R functions from
C/C++ directly, wich is currently a problem, as I understand.

Here is C code that calls R in BATCH mode with arguments.
Then R runs script args.R wich reads the input arguments with Sys.getenv()
function and prints output to args.out and err.out files.

May be someone will find it usefull :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


char emsg[] = "can't redirect %s to %s\n";

void main ()
{
	int result, i;
	char buf[5120];

	if (!freopen( "args.R", "r", stdin )) {
		fprintf( stderr, emsg, "stdin", "args.R" );
		exit( 1 );
	}
	if (!freopen( "args.out", "w", stdout )) {
		fprintf( stderr, emsg, "stdout", "args.out" );
		exit( 1 );
	}
	if (!freopen( "err.out", "a", stderr )) {
		fprintf( stderr, emsg, "stderr", "err.out" );
		exit( 1 );
	}

	strcpy( buf, "Rterm --slave --no-save --no-restore ARG1=1 ARG2=2" );

	if (result = system( buf ))
		fprintf( stderr, "exit code = %d, errno = %d\n", result, 
errno );
}





Quoting Prof Brian Ripley <ripley at stats.ox.ac.uk>: