12 #ifndef ROOT_R_TRDataFrame
13 #define ROOT_R_TRDataFrame
177 class TRDataFrame:
public TObject {
178 friend class TRInterface;
179 friend SEXP Rcpp::wrap<TRDataFrame>(
const TRDataFrame &f);
185 friend class TRDataFrame;
192 Binding(Rcpp::DataFrame &_df, TString name): fName(name), fDf(_df) {}
197 Binding(
const Binding &obj): fName(obj.fName), fDf(obj.fDf) {}
202 template <
class T> Binding operator=(T var)
204 Int_t size = fDf.size(), i = 0;
205 Rcpp::CharacterVector names = fDf.attr(
"names");
206 Bool_t found =
false;
208 if (names[i] == fName.Data()) {
214 if (found) fDf[fName.Data()] = var;
217 fDf = Rcpp::DataFrame::create(ROOT::R::Label[fName.Data()] = var);
219 Rcpp::List nDf(size + 1);
220 Rcpp::CharacterVector nnames(size + 1);
221 for (i = 0; i < size; i++) {
223 nnames[i] = names[i];
226 nnames[size] = fName.Data();
227 nDf.attr(
"class") = fDf.attr(
"class") ;
228 nDf.attr(
"row.names") = fDf.attr(
"row.names") ;
229 nDf.attr(
"names") = nnames ;
239 Binding operator=(Binding obj)
241 Int_t size = fDf.size(), i = 0;
242 Rcpp::CharacterVector names = fDf.attr(
"names");
243 Bool_t found =
false;
245 if (names[i] == fName.Data()) {
251 if (found) fDf[fName.Data()] = obj.fDf[obj.fName.Data()];
253 Rcpp::List nDf(size + 1);
254 Rcpp::CharacterVector nnames(size + 1);
255 for (i = 0; i < size; i++) {
256 nDf[i] = obj.fDf[i] ;
257 nnames[i] = names[i];
259 nDf[size] = obj.fDf[obj.fName.Data()];
260 nnames[size] = fName.Data();
262 nDf.attr(
"class") = obj.fDf.attr(
"class") ;
263 nDf.attr(
"row.names") = obj.fDf.attr(
"row.names") ;
264 nDf.attr(
"names") = nnames ;
276 template <
class T> Binding &operator >>(T &var)
278 var = Rcpp::as<T>(fDf[fName.Data()]);
281 Binding operator >>(Binding var)
283 var.fDf[var.fName.Data()] = fDf[fName.Data()];
292 template <
class T> Binding &operator <<(T var)
294 Int_t size = fDf.size(), i = 0;
295 Rcpp::CharacterVector names = fDf.attr(
"names");
296 Bool_t found =
false;
298 if (names[i] == fName.Data()) {
304 if (found) fDf[fName.Data()] = var;
306 Rcpp::List nDf(size + 1);
307 Rcpp::CharacterVector nnames(size + 1);
308 for (i = 0; i < size; i++) {
310 nnames[i] = names[i];
313 nnames[size] = fName.Data();
315 nDf.attr(
"class") = fDf.attr(
"class") ;
316 nDf.attr(
"row.names") = fDf.attr(
"row.names") ;
317 nDf.attr(
"names") = nnames ;
322 template <
class T>
operator T()
324 return Rcpp::as<T>(fDf[fName.Data()]);
326 template <
class T>
operator T()
const
328 return Rcpp::as<T>(fDf[fName.Data()]);
333 Rcpp::DataFrame &fDf;
344 TRDataFrame(SEXP obj)
346 df = Rcpp::as<Rcpp::DataFrame>(obj);
352 TRDataFrame(
const TRDataFrame &_df);
357 TRDataFrame(
const Rcpp::DataFrame &_df): df(_df) {};
361 Binding operator[](
const TString &name);
363 TRDataFrame &operator=(TRDataFrame &obj)
369 TRDataFrame &operator=(TRDataFrame obj)
375 TRDataFrame &operator=(SEXP obj)
377 df = Rcpp::as<Rcpp::DataFrame>(obj);
386 operator SEXP()
const
395 Int_t GetNcols() {
return df.size(); }
400 Int_t GetNrows() {
return df.nrows(); }
405 TVectorString GetColNames()
407 Rcpp::CharacterVector names = df.attr(
"names");
408 TVectorString rnames(GetNcols());
409 for (Int_t i = 0; i < GetNcols(); i++) rnames[i] = names[i];
418 template<
class T> TMatrixT<T> AsMatrix()
420 TRFunctionImport asMatrix(
"as.matrix");
421 return Rcpp::as<TMatrixT<T> >(asMatrix(df));
428 void Print(
const Char_t *label =
"")
430 TRFunctionImport print(
"print");
431 if (label && !label[0]) {
438 ClassDef(TRDataFrame, 0)