I had a delve into R's guts and came up with some smelly intestines to play with.
The command line is copied from C's argc/argv into a global C variable with this function in the source code:
void R_set_command_line_arguments(int argc, char **argv)
So we need a little C wrapper to get round the fact that the first parameter isn't a pointer:
#include "R.h"
#include "R_ext/RStartup.h"
void set_command(int *pargc, char **argv){
R_set_command_line_arguments(*pargc, argv);
}
compile in the usual way:
R CMD SHLIB setit.c
load, call:
> dyn.load("setit.so")
> commandArgs()
[1] "/usr/lib/R/bin/exec/R"
> invisible(.C("set_command",as.integer(2),c("Foo","Bar")))
> commandArgs()
[1] "Foo" "Bar"
from then on commandArgs()
will return that vector until you change it.