Hello R-users, I have been running a script which produces objects based on the column names of a data.frame. The column names are of the form CB_1-1, CB_1-2, etc. Now this calculation was rather long and memory intensive, so I would rather not have to do it again after fixing the column names using "make.names". As a consequence, I am left with a bunch of R objects with `-` in the name. Accessing them is proving challenging and any help would be appreciated. Reproducible example: `cb_1-2` <- "hello world" t <- "cb_1-2" t <- as.name(t) t <- eval(parse(text = t)) Error in eval(parse(text = t)) : object 'cb_1' not found Thanks. huzefa
On 18/09/2019 8:43 a.m., Huzefa Khalil wrote:> Hello R-users, > > I have been running a script which produces objects based on the > column names of a data.frame. The column names are of the form CB_1-1, > CB_1-2, etc. Now this calculation was rather long and memory > intensive, so I would rather not have to do it again after fixing the > column names using "make.names". As a consequence, I am left with a > bunch of R objects with `-` in the name. > Accessing them is proving challenging and any help would be appreciated. > > Reproducible example: > `cb_1-2` <- "hello world" > t <- "cb_1-2" > t <- as.name(t) > t <- eval(parse(text = t)) > > Error in eval(parse(text = t)) : object 'cb_1' not foundAfter t <- as.name(t), you already have language: no need to parse it again. So eval(t) works. If you have more complicated expressions, use call() to set them ?p. For example, call("paste0", t, "!") evaluates to paste0(`cb_1-2`, "!") and evaluating that expression via eval(call("paste0", t, "!")) gives [1] "hello world!" Don't go back and forth between language objects and text representations of them, because it's hard to do that without introducing changes. In other words, don't use eval(parse()). Duncan Murdoch
That worked! Thanks for the explanation. On Wed, Sep 18, 2019 at 10:06 AM Duncan Murdoch <murdoch.duncan at gmail.com> wrote:> > On 18/09/2019 8:43 a.m., Huzefa Khalil wrote: > > Hello R-users, > > > > I have been running a script which produces objects based on the > > column names of a data.frame. The column names are of the form CB_1-1, > > CB_1-2, etc. Now this calculation was rather long and memory > > intensive, so I would rather not have to do it again after fixing the > > column names using "make.names". As a consequence, I am left with a > > bunch of R objects with `-` in the name. > > Accessing them is proving challenging and any help would be appreciated. > > > > Reproducible example: > > `cb_1-2` <- "hello world" > > t <- "cb_1-2" > > t <- as.name(t) > > t <- eval(parse(text = t)) > > > > Error in eval(parse(text = t)) : object 'cb_1' not found > > After t <- as.name(t), you already have language: no need to parse it > again. So > > eval(t) > > works. If you have more complicated expressions, use call() to set them > ?p. For example, call("paste0", t, "!") evaluates to > > paste0(`cb_1-2`, "!") > > and evaluating that expression via > > eval(call("paste0", t, "!")) > > gives > > [1] "hello world!" > > Don't go back and forth between language objects and text > representations of them, because it's hard to do that without > introducing changes. In other words, don't use eval(parse()). > > Duncan Murdoch