[R] using get() in assign()
Peter Dalgaard
p.dalgaard at biostat.ku.dk
Wed Dec 29 10:03:44 CET 2004
thomas hills <thills at mail.utexas.edu> writes:
> I'm trying to rename the columns in a list of data.frames using the
> following...
>
> for(i in 1:length(filenames)) {
> assign(names(get(filenames[i])), c("name", "infood", "time") ) }
>
> R returns no errors, but the names are unchanged in the data.frames.
>
> The original names were things like
>
> > names(get(filenames[2]))
> [1] "Tc45w4.V1" "Tc45w4.V2" "Tc45w4.V3"
>
> after the above procedure they are still those names.
>
> Ideas appreciated. Thanks.
assign() takes a character string as its first argument, so you
probably now have a variable called "Tc45w4.V1" (it's a semi-bug that
it doesn't barf when passed a character vector of length > 1). What
you seem to want is
for(i in 1:length(filenames)) {
t <- get(filenames[i])
names(t) <- c("name", "infood", "time")
assign(filenames[i], t)
}
It is easier with a list
for (i in seq(along=listoftables))
names(listoftables[[i]]) <- c("name", "infood", "time")
but *not* "for (i in listoftables) names(i) <- ..." because you'd be
changing the names of a copy of the actual elements.
I suspect the jury is still out on whether it is good programming
practice to do
listoftables <- lapply(listoftables, "names<-", c("name", "infood", "time"))
but it is tempting in cases like this. (The awkward bit is that for
performance reasons, assignment functions -- names<-, [<-, etc. --
might not leave their argument unchanged.)
--
O__ ---- Peter Dalgaard Blegdamsvej 3
c/ /'_ --- Dept. of Biostatistics 2200 Cph. N
(*) \(*) -- University of Copenhagen Denmark Ph: (+45) 35327918
~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk) FAX: (+45) 35327907
More information about the R-help
mailing list