Fail to save an object using name as string

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Fail to save an object using name as string

R help mailing list-2
Dear list member,

I think that I have detected a strange behavior of the save() command:

 > year <- "2000"
 > assign(paste0("Var_", year), list(A=10, B=20))
 > get(paste0("Var_", year))
$A
[1] 10

$B
[1] 20

# At this point all is ok, I have created a list of name Var_2000

 > save(paste0("Var_", year), file=paste0("Var_", year, ".Rdata"))
Error in save(paste0("Var_", year), file = paste0("Var_", year,
".Rdata")) :
   objet ‘paste0("Var_", year)’ introuvable

(introuvable=cannot be found)

but

 > save("Var_2000", file=paste0("Var_", year, ".Rdata"))

When I read the help for save: ?save

...    the names of the objects to be saved (as symbols or character
strings).

I checked if paste0("Var_", year) produced a character string:

 > str("Var_2000")
  chr "Var_2000"
 > str(paste0("Var_", year))
  chr "Var_2000"

The solution was to include the name in the list argument:

 > save(list=paste0("Var_", year), file=paste0("Var_", year, ".Rdata"))

But I don't understand what is the difference between "Var_2000" and
paste0("Var_", year) as both produced the same output.

Thanks for your help,

Marc


R Under development (unstable) (2018-03-23 r74448) -- "Unsuffered
Consequences"
Copyright (C) 2018 The R Foundation for Statistical Computing
Platform: x86_64-apple-darwin15.6.0 (64-bit)

______________________________________________
[hidden email] mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
Reply | Threaded
Open this post in threaded view
|

Re: Fail to save an object using name as string

Jeff Newmiller
Have you ever noticed that when you run

x <- 1:5
y <- 2:6
plot( x, y+1 )

you get the expressions you used in your call to plot on the axis labels? `x` is an expression consisting of a single symbol and y+1 is an expression consisting of the addition operator and two arguments: the symbol x and the constant 1. Plot uses these expressions in two ways: one to get numbers to plot, but also converts the expressions into strings that can be printed on the axes.

The save function has an `...` argument that it expects to find symbol names in,  and when you pass an expression as an unnamed argument instead and it then tries to convert the expression to a string and use that as a name for a variable, you get problems.... so don't do that.

The save function also has the named argument `list` that does not have that symbol-name-extracting behaviour. By explicitly passing a vector of character strings (of length one in your case) in the named `list` argument you avoid that special handling applied by the save function to the `...` argument.

It does seem strange at first, but it goes along with some rather convenient features of the R statistical environment like formulas and intuitive plot labeling, and the ability to use

save( Var_2000, file = paste0( "Var_", year, ".Rdata" ) )

with no quotes.

On April 9, 2018 9:11:49 PM PDT, Marc Girondot via R-help <[hidden email]> wrote:

>Dear list member,
>
>I think that I have detected a strange behavior of the save() command:
>
> > year <- "2000"
> > assign(paste0("Var_", year), list(A=10, B=20))
> > get(paste0("Var_", year))
>$A
>[1] 10
>
>$B
>[1] 20
>
># At this point all is ok, I have created a list of name Var_2000
>
> > save(paste0("Var_", year), file=paste0("Var_", year, ".Rdata"))
>Error in save(paste0("Var_", year), file = paste0("Var_", year,
>".Rdata")) :
>   objet ‘paste0("Var_", year)’ introuvable
>
>(introuvable=cannot be found)
>
>but
>
> > save("Var_2000", file=paste0("Var_", year, ".Rdata"))
>
>When I read the help for save: ?save
>
>...    the names of the objects to be saved (as symbols or character
>strings).
>
>I checked if paste0("Var_", year) produced a character string:
>
> > str("Var_2000")
>  chr "Var_2000"
> > str(paste0("Var_", year))
>  chr "Var_2000"
>
>The solution was to include the name in the list argument:
>
> > save(list=paste0("Var_", year), file=paste0("Var_", year, ".Rdata"))
>
>But I don't understand what is the difference between "Var_2000" and
>paste0("Var_", year) as both produced the same output.
>
>Thanks for your help,
>
>Marc
>
>
>R Under development (unstable) (2018-03-23 r74448) -- "Unsuffered
>Consequences"
>Copyright (C) 2018 The R Foundation for Statistical Computing
>Platform: x86_64-apple-darwin15.6.0 (64-bit)
>
>______________________________________________
>[hidden email] mailing list -- To UNSUBSCRIBE and more, see
>https://stat.ethz.ch/mailman/listinfo/r-help
>PLEASE do read the posting guide
>http://www.R-project.org/posting-guide.html
>and provide commented, minimal, self-contained, reproducible code.

--
Sent from my phone. Please excuse my brevity.

______________________________________________
[hidden email] mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.