21#ifndef Rcpp__DataFrame_h
22#define Rcpp__DataFrame_h
29 Rf_setAttrib(df, R_NamesSymbol, Rf_allocVector(STRSXP, 0));
30 Rf_setAttrib(df, R_RowNamesSymbol, Rf_allocVector(INTSXP, 0));
31 Rf_setAttrib(df, R_ClassSymbol, Rf_mkString(
"data.frame"));
36 template <
template <
class>
class StoragePolicy>
53 if (*
this != other)
set__(other);
68 inline R_xlen_t
nrow()
const {
69#if R_VERSION < R_Version(4,6,0)
71 return Rf_xlength(rn);
84 void push_back(
const T&
object,
const std::string& name ){
96 void push_front(
const T&
object,
const std::string& name){
111 template <
typename... T>
118 if( ::Rf_inherits( x,
"data.frame" )){
127 R_xlen_t max_rows = 0;
128 bool invalid_column_size =
false;
132 if (Rf_xlength(*it) > max_rows) {
133 max_rows = Rf_xlength(*it);
138 if (Rf_xlength(*it) == 0 || ( Rf_xlength(*it) > 1 && max_rows % Rf_xlength(*it) != 0 )) {
140 invalid_column_size =
true;
144 if (invalid_column_size) {
145 warning(
"Column sizes are not equal in DataFrame::push_back, object degrading to List\n");
152 bool use_default_strings_as_factors = true ;
153 bool strings_as_factors = true ;
154 int strings_as_factors_index = -1 ;
155 R_xlen_t n = obj.
size() ;
157 if( !
names.isNULL() ){
158 for(
int i=0; i<n; i++){
159 if(
names[i] ==
"stringsAsFactors" ){
160 strings_as_factors_index = i ;
161 use_default_strings_as_factors = false ;
162 if( !
as<bool>(obj[i]) ) strings_as_factors = false ;
167 if( use_default_strings_as_factors )
169 SEXP as_df_symb = Rf_install(
"as.data.frame");
170 SEXP strings_as_factors_symb = Rf_install(
"stringsAsFactors");
172 obj.
erase(strings_as_factors_index) ;
173 names.erase(strings_as_factors_index) ;
175 Shield<SEXP> call( Rf_lang3(as_df_symb, obj, Rf_ScalarLogical(strings_as_factors) ) ) ;
176 SET_TAG( CDDR(call), strings_as_factors_symb ) ;
AttributeProxy attr(const std::string &name)
static DataFrame_Impl from_list(Parent obj)
void push_back(const T &object)
DataFrame_Impl(const T &obj)
void push_front(const T &object)
DataFrame_Impl(const DataFrame_Impl &other)
void set_type_after_push()
Vector< VECSXP, StoragePolicy > Parent
DataFrame_Impl & operator=(DataFrame_Impl &other)
void push_front(const T &object, const std::string &name)
static DataFrame_Impl create()
void push_back(const T &object, const std::string &name)
static DataFrame_Impl create(const T &... args)
DataFrame_Impl & operator=(SEXP x)
iterator erase(int position)
void push_back(const T &object)
void push_front(const T &object)
traits::r_vector_iterator< RTYPE, PreserveStorage >::type iterator
internal implementation details
SEXP convert_using_rfunction(SEXP x, const char *const fun)
Vector< STRSXP > CharacterVector
SEXP Rcpp_fast_eval(SEXP expr, SEXP env)
DataFrame_Impl< PreserveStorage > DataFrame
void warning(const std::string &message)