RCPP-无法访问StrinvgVector的元素

时间:2018-11-23 21:35:55

标签: r string rcpp

http://gallery.rcpp.org/articles/working-with-Rcpp-StringVector/

我使用上面的链接进行尝试,因为我想在R中使用字符串或字符向量

但是Rcpp出于某种原因将向量的元素连接起来,我正在使用Rcout尝试了解正在发生的事情,但我不知道它是什么:

cppFunction('CharacterVector test(NumericMatrix h, NumericMatrix nt, StringVector d, int r){

            CharacterVector m(h.ncol());
            Function f("paste0");
            for(int i = 0; i < d.size(); i++){
              Rcout << d[i];
            }

            return m;
            }')

h <- matrix(0,nrow=2, ncol =2)
colnames(h) <- c("A", "B")
nt <- matrix(0,nrow=2, ncol =2)

d <- c("2019-03", "2014-04")
test(h, nt, d, 1)

Rcout的输出是:

2019-032014-04[1] "" ""

代替:

"2019-03" "2014-04"

为什么会这样?

1 个答案:

答案 0 :(得分:2)

如果您要在发送到Rcpp::Rcout的每个元素后面都留一个空格,则必须这样说。您需要更改

Rcout << d[i];

Rcout << d[i] << " ";

此外,由于hrbrmstr的评论,我现在注意到,您还希望在打印每个元素时都使用引号。同样,如果您想使用引号,则必须告诉Rcout,它不会自动发生。然后,您将上述行进一步修改为

Rcout << "\"" << d[i] << "\" ";

我还要在函数结束前添加新行。因此,让我们进行比较;我的文件中有C ++代码so-answer.cpp

#include <Rcpp.h>

using namespace Rcpp;

// [[Rcpp::export]]
CharacterVector test(NumericMatrix h, NumericMatrix nt, StringVector d, int r){

    CharacterVector m(h.ncol());
    Function f("paste0");
    for(int i = 0; i < d.size(); i++){
        Rcout << d[i];
    }

    return m;
}

// [[Rcpp::export]]
CharacterVector test2(NumericMatrix h, NumericMatrix nt, StringVector d, int r){

    CharacterVector m(h.ncol());
    Function f("paste0");
    for(int i = 0; i < d.size(); i++){
        Rcout << "\"" << d[i] << "\" ";
    }

    Rcout << "\n";

    return m;
}

/*** R
h <- matrix(0,nrow=2, ncol =2)
colnames(h) <- c("A", "B")
nt <- matrix(0,nrow=2, ncol =2)

d <- c("2019-03", "2014-04")
test(h, nt, d, 1)
test2(h, nt, d, 1)
*/

然后,当我使用Rcpp::sourceCpp()进行编译并公开给R时:

Rcpp::sourceCpp("so-answer.cpp")
#> 
#> > h <- matrix(0,nrow=2, ncol =2)
#> 
#> > colnames(h) <- c("A", "B")
#> 
#> > nt <- matrix(0,nrow=2, ncol =2)
#> 
#> > d <- c("2019-03", "2014-04")
#> 
#> > test(h, nt, d, 1)
#> 2019-032014-04[1] "" ""
#> 
#> > test2(h, nt, d, 1)
#> "2019-03" "2014-04" 
#> [1] "" ""

reprex package(v0.2.1)于2018-11-23创建

我还要注意,我要确保所有多余的代码都准备好了,但是我还是把它留了下来。