[R] Convert a character string to variable names

Richard O'Keefe r@oknz @end|ng |rom gm@||@com
Fri Feb 11 06:25:02 CET 2022


You wrote "32 numbers is not a value".
It is, it really is.  When you have a vector like
 x <- 1:32
you have a simple variable (x) referring to an immutable value
(1, 2, ..., 32).  A vector in R is NOT a collection of mutable
boxes, it is a collection of *numbers* (or strings).  The vector
itself is a good a value as ever twanged.  You cannot change it.
A statement like
 x[i] <- 77
is just shorthand for
 x <- "[<-"(x, i, 77)
which constructs a whole new 32-number value and assigns that to x.
(The actual implementation is cleverer when it can be, but often it
cannot be clever.)
Pure values like vectors can be shared: if x is a vector,
then y <- x is a constant time operation.  If you then change
y, you only change y, not the vector.  x is unchanged.


On Wed, 9 Feb 2022 at 17:06, Ebert,Timothy Aaron <tebert using ufl.edu> wrote:

> "A variable in R can refer to many things, ..." I agree.
> "It absolutely _can_ refer to a list, ..." I partly agree. In R as a
> programming language I agree. In R as a statistical analysis tool then only
> partly. Typically one would need to limit the list so each variable would
> be of the same length and all values within the variable be of the same
> data type (integer, real, factor, character). As a programmer yes, as a
> statistician not really unless you always qualify the type of list
> considered and that gets tiresome.
>
> R does name individual elements using numeric place names: hence df[row,
> column]. Each element must have a unique address, and that is true in all
> computer languages.
>
> A dataframe is a list of columns of the same length containing the same
> data type within a column.
>
> mtcars$disp does not have a value (a value is one number). With 32
> elements I can calculate a mean and the mean is a value. 32 numbers is not
> a value. I suppose a single value could be the starting memory address of
> the name, but I don't see how that distinction helps unless one is doing
> Assembly or Machine language programming.
>
> I have never used get(), so I will keep that in mind. I agree that it
> makes life much easier to enter the data in the way it will be analyzed.
>
>
>
>
> -----Original Message-----
> From: Jeff Newmiller <jdnewmil using dcn.davis.ca.us>
> Sent: Tuesday, February 8, 2022 10:10 PM
> To: r-help using r-project.org; Ebert,Timothy Aaron <tebert using ufl.edu>; Richard
> O'Keefe <raoknz using gmail.com>; Erin Hodgess <erinm.hodgess using gmail.com>
> Cc: r-help using r-project.org
> Subject: Re: [R] Convert a character string to variable names
>
> [External Email]
>
> A variable in R can refer to many things, but it cannot be an element of a
> vector. It absolutely _can_ refer to a list, a list of lists, a function,
> an environment, and any of the various kinds of atomic vectors that you
> seem to think of as variables. (R does _not_ name individual elements of
> vectors, unlike many other languages.)
>
> The things you can do with the mtcars object may be different than the
> things you can do with the object identified by the expression mtcars$disp,
> but the former has a variable name in an environment while the latter is
> embedded within the former. mtcars$disp is shorthand for the expression
> mtcars[[ "disp" ]] which searches the names attribute of the mtcars list (a
> data frame is a list of columns) to refer to that object.
>
> R allows non-standard evaluation to make elements of lists accessible as
> though they were variables in an environment, such as with( mtcars, disp )
> or various tidyverse evaluation conventions. But while the expression
> mtcars$disp DOES have a value( it is an atomic vector of 32 integer
> elements) it is not a variable so get("mtcars$disp") cannot be expected to
> work (as it does not). You may be confusing "variable" with "object" ...
> lots of objects have no variable names.
>
> I have done all sorts of complicated data manipulations in R, but I have
> never found a situation where a use of get() could not be replaced with a
> clearer way to get the job done. Using lists is central to this... avoid
> making distinct variables in the first place if you plan to be retrieving
> them later indirectly like this.
>
> On February 8, 2022 5:45:39 PM PST, "Ebert,Timothy Aaron" <tebert using ufl.edu>
> wrote:
> >
> >I had thought that mtcars in "mtcars$disp" was the name of a dataframe
> and that "disp" was the name of a column in the dataframe. If I would make
> a model like horse power = displacement then "disp" would be a variable in
> the model and I can find values for this variable in the "disp" column in
> the "mtcars" dataframe. I am not sure how I would use "mtcars" as a
> variable.
> >"mtcars$disp" has no specific value, though it will have a specific value
> for any given row of data (assuming rows are observations).
> >
> >Tim
> >
> >
> >-----Original Message-----
> >From: R-help <r-help-bounces using r-project.org> On Behalf Of Richard
> >O'Keefe
> >Sent: Tuesday, February 8, 2022 8:17 PM
> >To: Erin Hodgess <erinm.hodgess using gmail.com>
> >Cc: r-help using r-project.org
> >Subject: Re: [R] Convert a character string to variable names
> >
> >[External Email]
> >
> >"mtcars$disp" is not a variable name.
> >"mtcars" is a variable name, and
> >get("mtcars") will get the value of that variable assign("mtcars",
> ~~whatever~~) will set it.
> >mtcars$disp is an *expression*,
> >where $ is an indexing operator
> >https://urldefense.proofpoint.com/v2/url?u=https-3A__cran.r-2Dproject.o
> >rg_doc_manuals_r-2Drelease_R-2Dlang.html-23Indexing&d=DwICAg&c=sJ6xIWYx
> >-zLMB3EPkvcnVg&r=9PEhQh2kVeAsRzsn7AkP-g&m=CI-7ZdIwlhUvhmOkVD7KJkv3IvSSW
> >y4ix2Iz1netW81V-NUV8aOVVqyn5-fmD6cf&s=RjRC5kve6D8k59qZQYcX-PR-aA4TTu1yf
> >LPBhHxSlWk&e=
> >so what you want is
> >> mtcars <- list(cyl=4, disp=1.8)
> >> eval(parse(text="mtcars$disp"))
> >[1] 1.8
> >
> >Though it's easy to do this, it's very seldom a good idea.
> >The combination of parse and eval can do ANYTHING, no matter how
> disastrous.  Less powerful techniques are safer.
> >Where do these strings come from in the first place?
> >Why isn't it c("disp", "hp", "cyl")?
> >
> >On Tue, 8 Feb 2022 at 11:56, Erin Hodgess <erinm.hodgess using gmail.com>
> wrote:
> >
> >> Hello!
> >>
> >> I have a character string that is a vector of variable names.  I
> >> would like to use those names to access the variables and create a
> matrix.
> >> I tried the following:
> >>
> >> > .x
> >>
> >> [1] "mtcars$disp" "mtcars$hp"   "mtcars$cyl"
> >>
> >> > .y <- NULL
> >>
> >> > for(i in 1:3) {
> >>
> >> + .y[i] <- c(as.name(.x[[i]]))
> >>
> >> + }
> >>
> >> > .y
> >>
> >> [[1]]
> >>
> >> `mtcars$disp`
> >>
> >>
> >> [[2]]
> >>
> >> `mtcars$hp`
> >>
> >>
> >> [[3]]
> >>
> >> `mtcars$cyl`
> >>
> >>
> >> But I am having trouble converting the variables in .y into a matrix.
> >>
> >>
> >> I tried all kinds of stuff with bquote, deparse, do.call, but no good.
> >>
> >>
> >> I have a feeling that it's something simple, and I'm just not seeing it.
> >>
> >>
> >> Thanks,
> >>
> >> Erin
> >>
> >>
> >>
> >>
> >> Erin Hodgess, PhD
> >> mailto: erinm.hodgess using gmail.com
> >>
> >>         [[alternative HTML version deleted]]
> >>
> >> ______________________________________________
> >> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> >> https://urldefense.proofpoint.com/v2/url?u=https-3A__stat.ethz.ch_mai
> >> l
> >> man_listinfo_r-2Dhelp&d=DwICAg&c=sJ6xIWYx-zLMB3EPkvcnVg&r=9PEhQh2kVeA
> >> s
> >> Rzsn7AkP-g&m=CI-7ZdIwlhUvhmOkVD7KJkv3IvSSWy4ix2Iz1netW81V-NUV8aOVVqyn
> >> 5 -fmD6cf&s=c8oCLZK8TFAAs5d3vhDyB52KR2I9WWSTg6kDjL8orcI&e=
> >> PLEASE do read the posting guide
> >> https://urldefense.proofpoint.com/v2/url?u=http-3A__www.R-2Dproject.o
> >> r
> >> g_posting-2Dguide.html&d=DwICAg&c=sJ6xIWYx-zLMB3EPkvcnVg&r=9PEhQh2kVe
> >> A
> >> sRzsn7AkP-g&m=CI-7ZdIwlhUvhmOkVD7KJkv3IvSSWy4ix2Iz1netW81V-NUV8aOVVqy
> >> n 5-fmD6cf&s=fTO2Qrx6DmlzcB2uqN4fsDmTMVZwfCsDbLtzMigHWXI&e=
> >> and provide commented, minimal, self-contained, reproducible code.
> >>
> >
> >        [[alternative HTML version deleted]]
> >
> >______________________________________________
> >R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> >https://urldefense.proofpoint.com/v2/url?u=https-3A__stat.ethz.ch_mailm
> >an_listinfo_r-2Dhelp&d=DwICAg&c=sJ6xIWYx-zLMB3EPkvcnVg&r=9PEhQh2kVeAsRz
> >sn7AkP-g&m=CI-7ZdIwlhUvhmOkVD7KJkv3IvSSWy4ix2Iz1netW81V-NUV8aOVVqyn5-fm
> >D6cf&s=c8oCLZK8TFAAs5d3vhDyB52KR2I9WWSTg6kDjL8orcI&e=
> >PLEASE do read the posting guide
> >https://urldefense.proofpoint.com/v2/url?u=http-3A__www.R-2Dproject.org
> >_posting-2Dguide.html&d=DwICAg&c=sJ6xIWYx-zLMB3EPkvcnVg&r=9PEhQh2kVeAsR
> >zsn7AkP-g&m=CI-7ZdIwlhUvhmOkVD7KJkv3IvSSWy4ix2Iz1netW81V-NUV8aOVVqyn5-f
> >mD6cf&s=fTO2Qrx6DmlzcB2uqN4fsDmTMVZwfCsDbLtzMigHWXI&e=
> >and provide commented, minimal, self-contained, reproducible code.
> >
> >______________________________________________
> >R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> >https://urldefense.proofpoint.com/v2/url?u=https-3A__stat.ethz.ch_mailm
> >an_listinfo_r-2Dhelp&d=DwIFaQ&c=sJ6xIWYx-zLMB3EPkvcnVg&r=9PEhQh2kVeAsRz
> >sn7AkP-g&m=jyG_tiJYdPBF8hat6uuafk5_ucrnBk_CkkVVmV3SLbXFMTeEFy-zgo7hVDFc
> >iokP&s=6B9_2qIT3ZzL4bGqJfWfMBQofnf6I2_bpLvdQIMDXj0&e=
> >PLEASE do read the posting guide
> >https://urldefense.proofpoint.com/v2/url?u=http-3A__www.R-2Dproject.org
> >_posting-2Dguide.html&d=DwIFaQ&c=sJ6xIWYx-zLMB3EPkvcnVg&r=9PEhQh2kVeAsR
> >zsn7AkP-g&m=jyG_tiJYdPBF8hat6uuafk5_ucrnBk_CkkVVmV3SLbXFMTeEFy-zgo7hVDF
> >ciokP&s=TTQhZrau_AmlW41w76jtlT7yR-niL17-f1QgYsWePvQ&e=
> >and provide commented, minimal, self-contained, reproducible code.
>
> --
> Sent from my phone. Please excuse my brevity.
>

	[[alternative HTML version deleted]]



More information about the R-help mailing list