Dir*_*tel 10
这是@spacedman的答案,作为一个简单的基于Rcpp的实现.我们必须在矢量上做一些体操才能使它变成char**格式:
#include "Rcpp.h"
#include "R_ext/RStartup.h"
// [[Rcpp::export]]
void setCmdArgs(std::vector<std::string> x) {
std::vector<char*> vec(x.size());
for (unsigned int i=0; i<x.size(); i++)
vec[i] = const_cast<char*>(x[i].c_str());
R_set_command_line_arguments(x.size(), static_cast<char**>(&(vec[0])));
}
/*** R
setCmdArgs(c("hello", "world"))
commandArgs()
setCmdArgs(c("good", "bye", "my", "friend"))
commandArgs()
*/
Run Code Online (Sandbox Code Playgroud)
如果将其保存在文件中并通过一次调用将其拉入sourceCpp(),则底部的R片段也会执行:
R> sourceCpp("/tmp/spacedman.cpp")
R> setCmdArgs(c("hello", "world"))
R> commandArgs()
[1] "hello" "world"
R> setCmdArgs(c("good", "bye", "my", "friend"))
R> commandArgs()
[1] "good" "bye" "my" "friend"
R>
Run Code Online (Sandbox Code Playgroud)
我深入研究了R的内脏,想出了一些臭臭的肠子.
命令行从C的argc/argv复制到源代码中具有此函数的全局C变量:
void R_set_command_line_arguments(int argc, char **argv)
Run Code Online (Sandbox Code Playgroud)
所以我们需要一个小的C包装器来绕过第一个参数不是指针的事实:
#include "R.h"
#include "R_ext/RStartup.h"
void set_command(int *pargc, char **argv){
R_set_command_line_arguments(*pargc, argv);
}
Run Code Online (Sandbox Code Playgroud)
以通常的方式编译:
R CMD SHLIB setit.c
Run Code Online (Sandbox Code Playgroud)
加载,调用:
> 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"
Run Code Online (Sandbox Code Playgroud)
从那时起commandArgs()将返回该向量,直到你改变它.