[R] Convert a character string to variable names

Richard O'Keefe r@oknz @end|ng |rom gm@||@com
Tue Feb 15 04:49:22 CET 2022


How soon they forget.
An object is characterised by three things:
- Identity, a property that distinguishes the
  object from all other objects regardless of
  their state
- State, what the object "knows", the information
  it contains, typically mutable
- Behaviour, what the object can "do", methods,
  generic functions, whatever.

Back in the days when there was much debate about what OOP
was and whether language X was an OOP language or merely an
"object-based" language, these were the criteria.

The thing about values is that they don't have an
identity.  Is there one copy of the number 137.035999206
in the computer or several?  If you can *tell* one
occurrence of 137.035999206 from another, you may be
dealing with objects, if not, with values.

There is no way to tell one copy of 137.035999206
from another in the R *language*.
However, there is a package "pryr" which provides
what used to be called "A Window into Hell".  It
provides things that relate to the R *implementation*
like refs(x) -- a number counting how many references
there are to x -- and address(x) -- a string with the
address of x as a string of hexadecimal digits.
One could imagine a different implementation of R in which
refs() was hideously expensive and in which address() could
change unpredictably, so I advise you to forget about them
at once.  Since the outcome of
   x <- 137.035999206
   y <- x + 0
   address(x) == address(y)
depends on the cleverness of the compiler, a thing
that is subject to change, you'll appreciate this is
not a smart thing to depend on.

The point is that you can only tell the difference
between copies of 137.035999206 by hacking into the
implementation in a way that isn't really consistent with
the spirit of the language.





On Mon, 14 Feb 2022 at 14:57, Ebert,Timothy Aaron <tebert using ufl.edu> wrote:

> But I find things like this website on mutable and immutable objects in
> python “
> https://www.geeksforgeeks.org/mutable-vs-immutable-objects-in-python/”
> Would this be better titled “Objects versus values in Python”?
>
>
>
> *From:* Richard O'Keefe <raoknz using gmail.com>
> *Sent:* Sunday, February 13, 2022 6:55 PM
> *To:* Ebert,Timothy Aaron <tebert using ufl.edu>
> *Cc:* Jeff Newmiller <jdnewmil using dcn.davis.ca.us>; r-help using r-project.org;
> Erin Hodgess <erinm.hodgess using gmail.com>
> *Subject:* Re: [R] Convert a character string to variable names
>
>
>
> *[External Email]*
>
> Objects have mutable state, values don't.
>
>
>
> On Sun, 13 Feb 2022 at 16:26, Ebert,Timothy Aaron <tebert using ufl.edu> wrote:
>
> How does “a value” differ from “an object?”
>
>
>
> *From:* Richard O'Keefe <raoknz using gmail.com>
> *Sent:* Friday, February 11, 2022 12:25 AM
> *To:* Ebert,Timothy Aaron <tebert using ufl.edu>
> *Cc:* Jeff Newmiller <jdnewmil using dcn.davis.ca.us>; r-help using r-project.org;
> Erin Hodgess <erinm.hodgess using gmail.com>
> *Subject:* Re: [R] Convert a character string to variable names
>
>
>
> *[External Email]*
>
> 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
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__as.name&d=DwMFaQ&c=sJ6xIWYx-zLMB3EPkvcnVg&r=9PEhQh2kVeAsRzsn7AkP-g&m=vzlTpQd9zYJkQ77y8VRROjzMQQJrJce_5rInko9TViGjuIt93PxagLXs9prJsMwy&s=Yrczdj8QHFrWSBSm_k4WyKN7ppY20M360b7tUmMCJaY&e=>
> (.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