On 8/17/2007 1:17 PM, david dav wrote: > Dear R list, > After a huge delay, I come back to this question. Using names of > variables inside a function is a problem I run into quite often. > Maybe this little example should help to get my point: > Suppose I want to make a function "llabel" to get the labels of the > variables from a data frame. > If no label is defined, "llabel" should return the name of the variable. > > library(Hmisc) > v1 <- c(1,2) > v2 <- c(1,2) > v3 <- c(1,3) > tablo <- data.frame(v1,v2,v3) > rm(v1,v2,v3) > > label(tablo$v1) <- "var1" > attach(tablo)
I don't think attach() does what most people think it does. I'd recommend avoiding it. with() is better. But this isn't your problem... > > # This does the trick on one variable. > if (label(v1) !="") label(v1) else names(data.frame(v1)) > if (label(v2) !="") label(v2) else names(data.frame(v2)) This isn't actually working. "data.frame(v1)" creates a new data frame containing v1, so names(data.frame(v1)) is just a long-winded way to say "v1". (This isn't true for every possible choice of v1, but it's true when v1 is a numeric vector.) > > But if I call this statement in a "llabel" function, > > llabel <- function(var) { > if (label(var) !="" ) > res <- label(var) > else res <- names(data.frame(var)) > return (res) } Use "else res <- deparse(substitute(var))" as the 4th line. This says to return the expression that was passed to the function if the label() function returned a blank. Duncan Murdoch > > I just get "var"s instead of the names when no label is defined : > > llabel(v1) # works > llabel(v2) # gives "var" instead of "v2" > > Thanks for your help. > > David > > > 2007/6/7, Uwe Ligges <[EMAIL PROTECTED]>: >> Not sure what you are going to get. Can you shorten your functions and >> specify some example data? Then please tell us what your expected result is. >> >> Best, >> Uwe Ligges >> >> >> >> >> david dav wrote: >> > Dear all, >> > >> > I 'd like to keep the names of variables when calling them in a function. >> > An example might help to understand my problem : >> > >> > The following function puts in a new data frame counts and percent of >> > a data.frame called as "tablo" >> > the step " nom.chiffr[1] <- names(vari) " is useless as names from the >> > original data.frame aren't kept in the function environement. >> > >> > Hoping I use appropriate R-vocabulary, I thank you for your help >> > >> > David >> > >> > descriptif <- function (tablo) { >> > descriptifvar <- function (vari) { >> > table(vari) >> > length(vari[!is.na(vari)]) >> > chiffr <- >> > cbind(table(vari),100*table(vari)/(length(vari[!is.na(vari)]))) >> > nom.chiffr <- rep(NA, dim(table(vari))) >> > if (is.null(names(vari))) nom.chiffr[1] <- paste(i,"") else >> > nom.chiffr[1] <- names(vari) >> > chiffr <- data.frame ( names(table(vari)),chiffr) >> > rownames(chiffr) <- NULL >> > chiffr <- data.frame (nom.chiffr, chiffr) >> > return(chiffr) >> > } >> > >> > res <- rep(NA, 4) >> > for (i in 1 : ncol(tablo)) >> > res <- rbind(res,descriptifvar(tablo[,i])) >> > colnames(res) <- c("variable", "niveau", "effectif", "pourcentage") >> > return(res[-1,]) >> > } >> > # NB I used this function on a data.frame with only factors in >> > >> > ______________________________________________ >> > R-help@stat.math.ethz.ch 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. >> > > ______________________________________________ > R-help@stat.math.ethz.ch 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. ______________________________________________ R-help@stat.math.ethz.ch 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.