Rcpp - не может получить доступ к элементам StrinvgVector - PullRequest
0 голосов
/ 24 ноября 2018

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 голосов
/ 24 ноября 2018

Если вам нужен пробел после каждого элемента, который вы отправляете на 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] "" ""

Создано в 2018 году-11-23 с помощью пакета prex (v0.2.1)

Также отмечу, что я уверен, что весь этот лишний код существует, но япросто оставил это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...