Dear Folks-- I'm trying to make a function that takes the columns I select from a data frame and then uses a for loop to print some information about each one, starting with the column name. I succeed in returning the column name, but nothing else I have tried using the variable colName, containing the name of the column, to refer to the column itself has worked.
Below I show my non-working function, and a data frame to test it on. I try six distinct ways of trying to turn the variable containing the name back into a name that is recognized by other R functions, mainly functions that display the properties of the object to which the name refers. These are also numbered in the code below in comments: 1. evaluate colName with eval(). 2. convert back into as symbol with as.symbol() 3. treat the data frame as the calling environment using with() 4. use substitute() to plug in any bound information bound in the environment 5. attach the data frame from which the column name is drawn 6. access the column using the $ operator I have actually made this function work using numeric indexing. But I do not understand why none of these ways of accessing the column using its name work. They all give me the properties of the name as a character vector, (except (2), which gives me its properties as a symbol) rather than the properties of the vector to which the name refers. What am I doing wrong? How do I use a variable containing an object's name to refer to the object itself? Although I'm hoping others will find the bald look caused by tearing my hair out to be attractive, I would appreciate any assistance you can offer in understanding this question. Warmly, andrewH testDFcols <- function(data.df, select=c(1:ncol(data.df)), bar=TRUE) { # A useful summary function if(bar) cat("##################################\n"); attach(data.df) for (column in select) { colName <-names(data.df)[column] cat("Column Name(", colName, "): ") # six failures cat(" Class=", class(eval(colName))) #1 cat(" Type=", typeof(as.symbol(colName))) #2 cat(" Length=", length(with(data.df, colName))) #3 cat(" Mode=", mode(substitute(colName)), "\n") #4 cat("Summary:\n") print(summary(colName)) cat("Structure:\n") str(colName) % if (is.factor(data.df$colName)) {cat("Factor Levels: ", levels(data.df$colName),"\n")} else cat("\n") #6 } detach(data.df) invisible(deparse(substitute(data.df))) } A1.df <- { # Makes a test data set A.df with 2-, 3-, & 4-factor sorting variables, making 24 # combinations, & a 4th variable with a unique data value for each combination. # No random component. year.2 <- factor( rep(1:2, each=12) ) cohort.3 <- factor( rep(rep(1:3,each=4),2) ) race.4 <- factor( rep(1:4, 6) ) D1 <- as.numeric(as.character(year.2))*1.1 + as.numeric(as.character(cohort.3))*1.01+ as.numeric(as.character(race.4))*1.001 data.frame(year.2,cohort.3,race.4,D1) } testDFcols(A1.df) -- View this message in context: http://r.789695.n4.nabble.com/Referring-to-an-object-by-a-variable-containing-its-name-6-failures-tp3817129p3817129.html Sent from the R help mailing list archive at Nabble.com. ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.