小编Tim*_*m P的帖子

在Windows下调试(逐行)Rcpp生成的DLL

最近我一直在尝试使用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)

debugging dll gdb r rcpp

20
推荐指数
1
解决办法
3246
查看次数

找到并合并data.frame中的重复行但忽略列顺序

我有一个包含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.

r duplicates plyr dataframe

5
推荐指数
1
解决办法
2847
查看次数

Rcpp:使用带Rcpp的数据框时的推荐代码结构(内联)

[我把它作为其他地方的评论勾勒出来,但决定创造一个正确的问题...]

在Rcpp中使用数据框时,目前在代码结构方面被认为是"最佳实践"?从R到C++代码可以很容易地"输出"输入数据帧,但是如果数据帧有n列,那么当前认为这个数据应该被分成n个独立的(C++)向量在被使用之前?

我之前关于在数据框中使用字符串(字符向量)列的问题的回答向我表明是的,这是正确的做法.特别是,似乎没有像df.name [i]那样的表示法直接引用数据帧信息(正如C结构中可能有的那样),除非我弄错了.

然而,这导致我们进入这样一种情况,即对数据进行子集化会更加麻烦 - 而不是能够在一行中对数据帧进行子集化,每个变量必须单独处理.那么,是否认为Rcpp中的子集最好通过布尔向量隐式地完成,比如说?

总而言之,我想简单地说,我想检查一下我目前的理解,即尽管数据框可以传送到C++代码,但是没有办法在"df.name"中直接引用其列的各个元素[ i]"时尚,并且没有通过选择满足简单标准的行来生成输入df的子数据帧的简单方法(例如,df.date在给定范围内).

c++ r dataframe rcpp data-structures

3
推荐指数
1
解决办法
1610
查看次数

将向量解包到列表中,向量的每个元素作为列表中的单独元素

使用以下代码,我正在创建一个列表:

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为一个向量参数,然后我可以插入到列表中.我怎样才能做到这一点?

r list concatenation

2
推荐指数
1
解决办法
257
查看次数

Rcpp:比较从 R 数据框派生的字符串的巧妙方法?

在 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)

c++ string r dataframe rcpp

1
推荐指数
1
解决办法
1531
查看次数

标签 统计

r ×5

dataframe ×3

rcpp ×3

c++ ×2

concatenation ×1

data-structures ×1

debugging ×1

dll ×1

duplicates ×1

gdb ×1

list ×1

plyr ×1

string ×1