2016-02-11 4 views
2

У меня есть функция Rcpp, которая дает мне как результат список с некоторыми векторами строк (std :: vector).Свернуть векторы в Rcpp

[[1]] [1] "0" "1" "0" "0" "0" "0" 
[[2]] [1] "0" "0" "0" "0" "0" "1" 
[[3]] [1] "0" "1" "0" "0" "0" "0" 
[[4]] [1] "0" "0" "0" "1" "0" "0" 

Я хочу, чтобы получить эти вещи, как это:

[[1]] [1] "010000" 
[[2]] [1] "000001" 
[[3]] [1] "010000" 
[[4]] [1] "000100" 

Теперь я использую: apply(do.call(rbind,myFunctioninCPP(),1,paste0,collapse="") , чтобы получить то, что я хочу.

Мне интересно, можно ли получить этот более «outboxbox» таким образом, чтобы получить результат myFunctioninCPP(). Какие-либо предложения?

+0

Каждый вектор списка является «std :: vector ». И список результатов не имеет фиксированного размера. – leandromarino

ответ

4

Выполните следующий код, который для демонстрационных целей принимает обычный вход IntegerVector. Использование std::ostringstream довольно простое и пригодится при попытке выполнить такие операции, как ваша.

#include <Rcpp.h> 
using namespace Rcpp; 

// [[Rcpp::export]] 
String concat(IntegerVector x) { 

    // convert intput to 'CharacterVector' 
    int nChar = x.size(); 
    CharacterVector y = as<CharacterVector>(x); 

    // initialize string output stream 
    std::ostringstream ossOut; 

    // concatenate input 
    for (int i = 0; i < nChar; i++) 
    ossOut << y[i]; 

    return ossOut.str(); 
} 

Теперь загрузите функцию в R, используя sourceCpp и вызвать его из внутри *apply петли.

## source c++ function 
library(Rcpp) 
sourceCpp("~/work/programming/concat.cpp") 

## test run 
lst <- list(c(0, 1, 0, 0, 0, 0), 
      c(0, 0, 0, 0, 0, 1), 
      c(0, 1, 0, 0, 0, 0), 
      c(0, 0, 0, 1, 0, 0)) 

lapply(lst, concat) 
[[1]] 
[1] "010000" 

[[2]] 
[1] "000001" 

[[3]] 
[1] "010000" 

[[4]] 
[1] "000100" 
+0

Большое спасибо! Оно работает! :) Мне пришлось использовать только финальные строки в моей CPPфункции! :) после инициализации строки поток вывода – leandromarino

+0

Рад помочь. Я включил первые несколько строк кода C++ только для целей репликации. Основное внимание уделяется 'ostringstream'. – fdetsch

Смежные вопросы