Rcpp: я хочу, чтобы функция считывала DataFrame, почему можно читать вектор с характером и обрабатывать его как фактор?

Вот минимальный пример:

// 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)? Я не хочу, чтобы пользователь функции случайно вставил неправильный тип.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …