Whit Armstrong
2009-Mar-17 20:45 UTC
[Rd] question on "row.names" attribute of dataframe when called from a compiled package
Why does the following show a class attribute of "character" when using the interpreter: x <- data.frame(hat=1:10) class(rownames(x)) ## returns [1] "character" but when called from c/cpp, the rownames attribute has no class attribute, and is in fact a vector of INTSXP?> .Call("print_class_of_rownames", x, package = "test")length(x): 10 TYPEOF(x): 13 R_ClassSymbol is null. NULL>is this the intended behaviour? -Whit here is my test code: SEXP print_class_of_rownames(SEXP dataframe_sexp) { SEXP x = getAttrib(dataframe_sexp,install("row.names")); cout << "length(x): " << length(x) << endl; cout << "TYPEOF(x): " << TYPEOF(x) << endl; if(getAttrib(x, R_ClassSymbol)==R_NilValue) { cout << "R_ClassSymbol is null." << endl; } else { cout << "R_ClassSymbol is a good value." << endl; } return R_NilValue; }
Simon Urbanek
2009-Mar-17 21:49 UTC
[Rd] question on "row.names" attribute of dataframe when called from a compiled package
On Mar 17, 2009, at 16:45 , Whit Armstrong wrote:> Why does the following show a class attribute of "character" when > using the interpreter: > > x <- data.frame(hat=1:10) > class(rownames(x)) ## returns [1] "character" > > but when called from c/cpp, the rownames attribute has no class > attributeNote the difference between class("foo") and attr("foo", "class") - some classes are implicit.> , and is in fact a vector of INTSXP? >Because the internal representation of automatic row names is c(NA, - dim(d)[1]) where d is the data frame. This is not exposed at the R level, though, since it's an implementation optimization.>> .Call("print_class_of_rownames", x, package = "test") > length(x): 10 > TYPEOF(x): 13 > R_ClassSymbol is null. > NULL >> > > is this the intended behaviour? >Yes - it saves a lot of space when using large datasets with automatic names. Cheers, Simon> -Whit > > > here is my test code: > > SEXP print_class_of_rownames(SEXP dataframe_sexp) { > SEXP x = getAttrib(dataframe_sexp,install("row.names")); > cout << "length(x): " << length(x) << endl; > cout << "TYPEOF(x): " << TYPEOF(x) << endl; > if(getAttrib(x, R_ClassSymbol)==R_NilValue) { > cout << "R_ClassSymbol is null." << endl; > } else { > cout << "R_ClassSymbol is a good value." << endl; > } > return R_NilValue; > } > > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel > >