I have now finished a long session of documenting and bug-fixing the way 
subscripting of data frames works -- you can see this in the NEWS file in 
R-devel.
As far as I know we are at the point where the only times that character
columns get converted to factors are in data.frame(), read.table() and
when as.data.frame() is called on a list.  (There are read.table-alikes in
other packages which will also convert.)  So if you have a character
column in a data frame, it should stay that way.
cbind.data.frame calls data.frame and so converts, and I believe it should
not.  There may be others (anyone know of any?).
This raises the possibility that using data.frame(I(foo)) could make foo a 
character column and not give it class "AsIs".   I've heard
comments that
having the additional class slows code down, but not seen any examples.
Any relevant experience or comments?
-- 
Brian D. Ripley,                  ripley@stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595