最近我一直在尝试使用Rcpp(内联)来生成DLL,这些DLL在提供的R输入上执行各种任务.在给定一组特定的R输入的情况下,我希望能够逐行调试这些DLL中的代码.(我在Windows下工作.)
为了说明,让我们考虑一个任何人都应该能够运行的具体例子......
下面的代码是一个非常简单的cxx函数,它只是输入向量的两倍.但请注意,有一个额外的变量myvar可以更改值几次,但不会影响输出 - 这已添加,以便我们能够看到调试过程何时正确运行.
library(inline)
library(Rcpp)
f0 <- cxxfunction(signature(a="numeric"), plugin="Rcpp", body='
Rcpp::NumericVector xa(a);
int myvar = 19;
int na = xa.size();
myvar = 27;
Rcpp::NumericVector out1(na);
for(int i=0; i < na; i++) {
out1[i] = 2*xa[i];
myvar++;
}
myvar = 101;
return(Rcpp::List::create( _["out1"] = out1));
')
Run Code Online (Sandbox Code Playgroud)
运行上面的命令之后,输入命令
getLoadedDLLs()
Run Code Online (Sandbox Code Playgroud)
在R会话中显示DLL列表.列出的最后一个应该是由上面的过程创建的DLL - 它有一个随机的临时名称,在我的情况下是
file7e61645c
Run Code Online (Sandbox Code Playgroud)
"Filename"列显示cxxfunction已将此DLL放在该位置tempdir(),这对我来说是当前的位置
C:/Users/TimP/AppData/Local/Temp/RtmpXuxtpa/file7e61645c.dll
Run Code Online (Sandbox Code Playgroud)
现在,调用DLL的明显方法是via f0,如下所示
> f0(c(-7,0.7,77))
$out1
[1] -14.0 1.4 154.0
Run Code Online (Sandbox Code Playgroud)
但我们当然也可以使用以下.Call命令直接通过名称调用DLL :
> .Call("file7e61645c",c(-7,0.7,77))
$out1
[1] -14.0 …Run Code Online (Sandbox Code Playgroud)