最近我一直在尝试使用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) 我有一个包含1,000行和3列的data.frame.它包含大量的重复项,我已经使用plyr来组合重复的行,并为每个组合添加一个计数,如本主题中所述.
这是我现在拥有的一个例子(如果我需要从那里开始,我还有原始的data.frame以及所有重复项):
name1 name2 name3 total
1 Bob Fred Sam 30
2 Bob Joe Frank 20
3 Frank Sam Tom 25
4 Sam Tom Frank 10
5 Fred Bob Sam 15
Run Code Online (Sandbox Code Playgroud)
但是,列顺序无关紧要.我只是想知道有多少行以任何顺序具有相同的三个条目.如何组合包含相同条目的行,忽略顺序?在这个例子中,我想要组合行1和5,以及行3和4.
[我把它作为其他地方的评论勾勒出来,但决定创造一个正确的问题...]
在Rcpp中使用数据框时,目前在代码结构方面被认为是"最佳实践"?从R到C++代码可以很容易地"输出"输入数据帧,但是如果数据帧有n列,那么当前认为这个数据应该被分成n个独立的(C++)向量在被使用之前?
我之前关于在数据框中使用字符串(字符向量)列的问题的回答向我表明是的,这是正确的做法.特别是,似乎没有像df.name [i]那样的表示法直接引用数据帧信息(正如C结构中可能有的那样),除非我弄错了.
然而,这导致我们进入这样一种情况,即对数据进行子集化会更加麻烦 - 而不是能够在一行中对数据帧进行子集化,每个变量必须单独处理.那么,是否认为Rcpp中的子集最好通过布尔向量隐式地完成,比如说?
总而言之,我想简单地说,我想检查一下我目前的理解,即尽管数据框可以传送到C++代码,但是没有办法在"df.name"中直接引用其列的各个元素[ i]"时尚,并且没有通过选择满足简单标准的行来生成输入df的子数据帧的简单方法(例如,df.date在给定范围内).
使用以下代码,我正在创建一个列表:
scales <- c(p="hye", r="t3")
details <- list(t=20,y="c", scales)
Run Code Online (Sandbox Code Playgroud)
目前,上面给出了一个列表如下:
$t
[1] 20
$y
[1] "c"
[[3]]
p r
"hye" "t3"
Run Code Online (Sandbox Code Playgroud)
但是我想要一个这样的列表:
$t
[1] 20
$y
[1] "c"
$p
[1] "hye"
$r
[1] "t3"
Run Code Online (Sandbox Code Playgroud)
由于这将在一个函数中重用,我想保留scales为一个向量参数,然后我可以插入到列表中.我怎样才能做到这一点?
在 Rcpp 处理字符串时遇到了一些麻烦,查看了“如何测试 Rcpp::CharacterVector 元素的相等性”,但情况比这要复杂一些。
为了说明这一点,假设我们有一个 200 行的姓名和标记数据框,随机生成:
df = data.frame(name = paste("Person",
sample(LETTERS[1:10],200,rep=TRUE),sep=""),
mark = pmax(pmin(round(rnorm(200,60,15)),100),0),
stringsAsFactors=FALSE)
Run Code Online (Sandbox Code Playgroud)
我发现以下内联代码(使用 Rcpp)正确计算出所有行的标记总和,其中命名的人是数据框中给出的第一个人(即 R 中的 df$name[1],或等效的 name [0] 在 Rcpp 代码中):
library(inline)
fastfunc_good1 <- cxxfunction(
signature(DFin = "data.frame"),
plugin = "Rcpp",
body = '
Rcpp::DataFrame DF(DFin);
Rcpp::CharacterVector name = DF["name"];
Rcpp::IntegerVector mark = DF["mark"];
Rcpp::CharacterVector targetname(1);
Rcpp::CharacterVector thisname(1);
int n = name.length();
int tot = 0;
targetname = name[0];
std::string s_targetname = as<std::string>(targetname);
for (int i = 0; i < n; i++) { …Run Code Online (Sandbox Code Playgroud)