5

Is there a functional form of the assignment operator? I would like to be able to call assignment with lapply, and if that's a bad idea I'm curious anyways.

Edit:

This is a toy example, and obviously there are better ways to go about doing this:

Let's say I have a list of data.frames, dat, each corresponding to a one run of an experiment. I would like to be able to add a new column, "subject", and give it a sham-name. The way I was thinking of it was something like

lapply(1:3, function(x) assign(data.frame = dat[[x]], column="subject", value=x)

The output could either be a list of modified data frames, or the modification could be purely a side effect.

dput of list starting list

list(structure(list(V1 = c(-1.16664504687199, -0.429499924318301,  2.15470735901367, -0.287839633854442, -0.850578353982526, 0.211636723222015,  -0.184714165752958, -0.773553182015158, 0.801811848828454, 1.39420292299319 ), V2 = c(-0.00828185523886259, -0.0215669898046275, 0.743065397283645,  -0.0268464140141802, 0.168027242784788, -0.602901928341917, 0.0740511186398372,  0.180307494696194, 0.131160421341309, -0.924995634374182)), .Names = c("V1",  "V2"), row.names = c(NA, -10L), class = "data.frame"), structure(list(     V1 = c(1.81912921386885, 1.17011641727415, 0.692247839769473,      0.0323050362633069, 1.35816977313292, -0.437475434344363,      -0.270255715332778, 0.96140963297774, 0.914691132220417,      -1.8014509598977), V2 = c(1.45082316226241, 2.05135744606495,      -0.787250759618171, 0.288104852581324, -0.376868533959846,      0.531872044490353, -0.750375220117567, -0.459592764008714,      0.991667163481123, 1.31280356980115)), .Names = c("V1", "V2" ), row.names = c(NA, -10L), class = "data.frame"), structure(list(     V1 = c(0.528912899341174, 0.464615157920766, -0.184211714281637,      0.526909095449027, -0.371529800682086, -0.483772861751781,      -2.02134822661341, -1.30841566046747, -0.738493559993166,      -0.221463545903242), V2 = c(-1.44732101816006, -0.161730785376045,      1.06294520132753, 1.22680614207705, -0.721565979363022, -0.438309438404104,      -0.0243401435910825, 0.624227513999603, 0.276605218579759,      -0.965640602482051)), .Names = c("V1", "V2"), row.names = c(NA,  -10L), class = "data.frame"))
Nathan
  • 340
  • 2
  • 11
  • 3
    can you give an example (doesn't have to be working, obviously) of the call and the output you'd expect? – hrbrmstr Jul 13 '15 at 20:18
  • I agree with @hrbrmstr, because maybe there is a misunderstanding. Do you mean assign function/operator or replacement functions? – SabDeM Jul 13 '15 at 20:25
  • The replacement operator is just `\`[<-\`` but that doesn't change the value of the variable. `a<-1:3; \`[<-\`(a,1,5)`. But it's unclear exactly what you are trying to accomplish. – MrFlick Jul 13 '15 at 20:25
  • 1
    There are various R functions that might be called when you use `[<-`. You can see their names by typing `methods("[<-")` – Frank Jul 13 '15 at 20:27
  • 1
    This related answer explains replacement functions and how they can be called in this way. http://stackoverflow.com/a/10491881/210673 – Aaron left Stack Overflow Jul 13 '15 at 21:01

2 Answers2

5

Maybe I don't get it but as stated in "The Art of R programming":

Any assignment statement in which the left side is not just an identifier (meaning a variable name) is considered a replacement function.

and so in fact you can always translate this:

names(x) <- c("a","b","ab")

to this:

x <- "names<-"(x,value=c("a","b","ab"))

the general rule is just "function_name<-"(<object>, value = c(...))

Edit to the comment:

It works with the " too:

> x <- c(1:3)
> x
[1] 1 2 3
> names(x) <- c("a","b","ab")
> x
 a  b ab 
 1  2  3 
> x
 a  b ab 
 1  2  3 
> x <- c(1:3)
> x
[1] 1 2 3
> x <- "names<-"(x,value=c("a","b","ab"))
> x
 a  b ab 
 1  2  3 
SabDeM
  • 7,050
  • 2
  • 25
  • 38
  • Sweet. The call I ended up using was tmp = lapply(1:3, function(x) `[<-.data.frame`(dat[[3]], "subject", value=x)) – Nathan Jul 13 '15 at 20:39
  • One note: you have to backtick the operator to get it to act like a function, not use quotes. – Nathan Jul 13 '15 at 20:41
3

There is the assign function. I don't see any problems with using it but you have to be aware of what environment you want to assign to. See the help ?assign for syntax.

Read this chapter carefully to understand the ins and outs of environments in detail. http://adv-r.had.co.nz/Environments.html

Mike Wise
  • 22,131
  • 8
  • 81
  • 104
  • Maybe I am wrong but I think that the OP wanted to know the replacement functions and not the assignment one. But I might be wrong of course. – SabDeM Jul 13 '15 at 20:21
  • 2
    He actually uses both terms, replacement operator in the title, and assignment operator in the text. – Mike Wise Jul 13 '15 at 20:30
  • 1
    Yeah, I'm being a bit inconsistent. I'm curious about both, but the specific example I had in mind was assignment. – Nathan Jul 13 '15 at 20:35