Я пытаюсь решить проблему с разрывом слов в 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()