изменить вектор, передав его функции в rcpp - PullRequest
0 голосов
/ 28 января 2020

Я пытаюсь решить проблему с разрывом слов в R cpp. Единственное, что я хочу сделать, это поместить все возможные решения в вектор StringVector, а не выводить их на экран. Я попытался передать вектор StringVector с именем container в функцию. Как только найдено новое решение, оно возвращается к container. Однако это не работает. После вызова функции контейнер все еще пуст. Кажется, что R cpp не позволяет "модифицировать на месте", если модификация изменяет длину вектора. Кто-нибудь знает, что я делаю не так или как мне этого добиться? Большое спасибо!

Вот мой код:

// [[Rcpp::export]]
String paste_strings(StringVector x, int begin, int end) {
  String out;
  for (int i=begin; i < end + 1; i++) {
    out += x[i];
    out += "\t";
  }
  return out;
}

// [[Rcpp::export]]
bool word_in_dict(String x, StringVector dict) {
  int n_word = dict.size();
  for (int i = 0; i < n_word; i++) {
    if (x == dict[i]) {
      return true;
    }
  }
  return false;
}

// [[Rcpp::export]]
void seq_seg_util_cpp(StringVector x, StringVector dict, StringVector prev_out, std::vector<StringVector> container) {
  int n = x.size();

  for (int i = 0; i < n; i++) {
    String prefix = paste_strings(x, 0, i);
    if (word_in_dict(prefix, dict)) {
      prev_out.push_back(prefix);
      if (i == (n-1)) {
        container.push_back(prev_out);
        // Rcout << prev_out << "\n";
        return;
      }
      StringVector new_x;
      for (int j = i+1; j < n; j++) new_x.push_back(x[j]);
      seq_seg_util_cpp(new_x, dict, prev_out, container);
    }
  }
}

// [[Rcpp::export]]
void seq_seg_cpp2(StringVector x, StringVector dict, std::vector<StringVector> container) {
  StringVector prev_out = StringVector::create();
  seq_seg_util_cpp(x, dict, prev_out, container);
}

В R,

> x <- c("a", "b", "c")
> dict <- c("a\t", "b\t", "c\t", "b\tc\t")
> all_splits <- list()
> seq_seg_cpp2(x, dict, all_splits)
> all_splits
list()
...