Я заинтересован в использовании Rcpp для создания фрейма данных с переменным числом столбцов. Под этим я подразумеваю, что количество столбцов будет известно только во время выполнения. Некоторые из столбцов будут стандартными, но другие будут повторяться n раз, где n - количество функций, которые я рассматриваю в конкретном прогоне.Rcpp Создать DataFrame с переменным числом столбцов
Я знаю, что я могу создать фрейм данных следующим образом:
IntegerVector i1(3); i1[0]=4;i1[1]=2134;i1[2]=3453;
IntegerVector i2(3); i2[0]=4123;i2[1]=343;i2[2]=99123;
DataFrame df = DataFrame::create(Named("V1")=i1,Named("V2")=i2);
, но в этом случае предполагается, что число столбцов равно 2.
Чтобы упростить объяснение того, что я нужно, предположим, что я хотел бы передать переменную SEXP, указав количество столбцов для создания в переменной. Что-то вроде:
RcppExport SEXP myFunc(SEXP n, SEXP <other stuff>)
IntegerVector i1(3); <compute i1>
IntegerVector i2(3); <compute i2>
for(int i=0;i<n;i++){compute vi}
DataFrame df = DataFrame::create(Named("Num")=i1,Named("ID")=i2,...,other columns v1 to vn);
где n передается в качестве аргумента. Окончательный кадр данных в R будет выглядеть
Num ID V1 ... Vn
1 2 5 'aasda'
...
(В действительности, имена столбцов не будет формы «Vx», но они будут известны во время выполнения.) Другими словами, я не могу использовать статический список
Named()=...
номер будет изменен.
Я пробовал пропустить часть «Именованный()» конструктора и затем называть столбцы в конце, но результаты являются нежелательными.
Можно ли это сделать?
Вы не согласны с передачей списка двухстолбцового фрейма данных и списка n-элементов? Затем вы можете использовать 'as.data.frame' в R, чтобы связать их вместе в кадре данных. Второй элемент вашего списка (т. Е. Ваш список векторов n-элементов) можно создать как вектор векторов (например, 'std :: vector>') и использовать 'Rcpp :: wrap' для преобразования это в R-список векторов. –
Bridgeburners
Хорошее решение @Bridgeburners. Никаких реальных накладных расходов с преобразованием 'as.data.frame' (' data.frame' - это причудливый «список»), и это должно сработать. @xbot: помните, что существует ограничение на 20 элементов для 'Rcpp :: List' и' Rcpp :: DataFrame's – hrbrmstr
. Я немного смущен этим обменом.Я думал, что «DataFrame» отличается от объектов класса-wasata.frame. –