У меня есть функция, в которой мне нужно составить таблицу (tab
, затем изменить одно значение - значение, где tab.names() == k
, где k
задается в вызове функции.
Глядя на http://dirk.eddelbuettel.com/code/rcpp/Rcpp-quickref.pdf, Я надеялся, что следующий код будет работать (замена "foo"
именем переменной), но я предполагаю, что для имени элемента должно быть статическим, а мое имя не будет , Я пытался использовать which
, но это не скомпилируется (недопустимое преобразование из 'char' в 'Rcpp :: traits :: storage_type <16> :: type {aka SEXPREC *}' - поэтому я делаю что-то не так есть.
#include <RcppArmadillo.h>
#include <algorithm>
//[[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
// [[Rcpp::export]]
IntegerVector fun(const arma::vec& assignment, int k) {
// count number of peptides per protein
IntegerVector tab = table(as<IntegerVector>(wrap(assignment)));
CharacterVector all_proteins = tab.names();
char kc = '0' + k;
// what I need a working version of:
tab(kc) = 1; // gets ignored, as does a [] version of the same thing.
// or
tab('0' + k) = 1; // also ignored
int ki = which(all_proteins == kc); // gives me compile errors
// extra credit
// tab.names(k-1) = "-1";
return tab;
}
/*** R
set.seed(23)
x <- rpois(20, 5)
k <- 5
fun(x, k)
# same thing in R:
expected_output <- table(x)
expected_output # before modification
# x
# 3 4 5 6 7 9 10 12
# 2 4 3 3 4 2 1 1
expected_output[as.character(k)] <- 1 # this is what I need help with
expected_output
# x
# 3 4 5 6 7 9 10 12
# 2 4 1 3 4 2 1 1
# extra credit:
names(expected_output)[as.character(k)] <- -1
*/
Я все еще изучаю rcpp и, что более важно, все еще учусь читать страницы справочника и вставлять правильные условия поиска в google / stackoverflow. Я уверен, что это основные вещи (и я открыт для лучших методов - в настоящее время я думаю, как программист R с точки зрения начальных подходов к проблемам, а не программист C ++.)
(Кстати - использование arma::vec
используется в других частях кода, которые я не показываю для простоты - я понимаю, что здесь это не полезно. Я обсуждал его переключение, но решил против этого по принципу, что Я протестировал эту часть, она работает, и последнее, что я хочу сделать, это добавить дополнительную ошибку ...)
Спасибо!