Search code examples
rlistdplyrassignment-operatortibble

R: Reference list item within the same list


In R, we can reference items created within that same list, i.e.:

list(a = a <- 1, b = a)

I am curious if there is a way to write a function which takes the place of a = a <- 1. That is, if something like

`%=%` <- function(x,y) {
  envir <- environment()
  char_x <- deparse(substitute(x))
  assign(char_x, y, parent.env(envir))
  unlist(lapply(setNames(seq_along(x),char_x), function(T) y))
}
# does not work
list(a%=%1, b=a)

is possible in R (i.e. returns the list given above)?

edit: I think this boils down to asking, 'can we call list with a language object that preserves all aspects of manually coding list?' (specifically, assigns the list's names attribute the left-hand side of the language element).

It seems to me that below shows that such a solution is hopeless.

my_call <- do.call(substitute, list(expr(expr = {x = y}), list(x=quote(a), y=1)))
equals <- languageEl(my_call, which = 1)
str(equals)
do.call(list, list(equals))

Solution

  • Welp, the clever folk behind tibble have figured this out in their lst() function (also in package dplyr)

    library(dplyr)
    lst(a=1, b=a, c=c(3,4), d=c)
    

    What a useful feature!