Вот минимальный пример:
// Enable C++11 via this plugin
// [[Rcpp::plugins("cpp11")]]
#include <Rcpp.h>
#include <string>
using namespace Rcpp;
using namespace std;
/**
* Wrapper function for testFunc
*/
// [[Rcpp::export]]
void testFunc(DataFrame vars_ ) {
cout << "Type of vars_ " << TYPEOF(vars_) << endl;
DataFrame vars = clone(vars_);
CharacterVector out(vars_.nrows());
vector<string> varsV(vars_.nrows());
vector<int> varsVInt(vars_.nrows());
//Matrix is filled with input, Types are set to string
for (int i = 0 ; i< vars_.size(); i++){
if(TYPEOF(vars_[i])==STRSXP) {
varsV=Rcpp::as<std::vector<string> > (vars_[i]);
cout << "Type of the column " << i << " of the input data.frame is String." << endl;
for(int j=0; j<vars_.nrows(); j++){
cout << "varsV["<<j<<"] "<<varsV[j] << endl;
}
}
if(TYPEOF(vars_[i])==INTSXP) {
cout << "Type of the column " << i << " of the input data.frame is Int/Factor." << endl;
varsVInt = Rcpp::as<std::vector<int> > (vars_[i]);
if(varsVInt.size()>0)
{
for(int j=0; j<vars_.nrows(); j++){
varsV[j]=to_string(varsVInt[j]);//Copy the vector to the string
cout << "varsV["<<j<<"] "<<varsV[j] << endl;
} // end for
} //end if
} // end if
} // endfor
}
Выполнить код:
ID <- c("0","1","2")
NAME2 <- c("Milla", "Milla","Miller")
dfString <-data.frame(ID,NAME2, stringsAsFactors=F)
################# test function
A = testFunc(as.data.frame(dfString[,2],stringsAsFactors=F))
B = testFunc(as.data.frame(dfString[,2]))
Вызов:
A = testFunc(as.data.frame(dfString[,2],stringsAsFactors=F))
Выход:
Type of vars_ 19
Type of the column 0 of the input data.frame is String.
varsV[0] Milla
varsV[1] Milla
varsV[2] Miller
Вызов:
B = testFunc(as.data.frame(dfString[,2]))
Выход:
Type of vars_ 19
Type of the column 0 of the input data.frame is Int/Factor.
varsV[0] 1
varsV[1] 1
varsV[2] 2
В void testFunc(DataFrame vars_ )
Я ожидаю Rcpp::DataFrame
Однако, если я вставлю столбец data.frame
который имеет класс character
затем он также читается без выдачи ошибки, так как тип выглядит одинаково (тип 19). это character vector
обрабатывается factor
см. вывод.
Есть ли способ заставить правильный тип (= Rcpp::DataFrame
)? Я не хочу, чтобы пользователь функции случайно вставил неправильный тип.
Задача ещё не решена.
Других решений пока нет …