Home > Mobile >  Referencing other items in a list before it is stored as an object
Referencing other items in a list before it is stored as an object

Time:12-22

I have a list and would like to create a new list entry, d, by binding together the existing list entries as shown below:

library(data.table)

## this works fine
example_list <- list("a" = data.frame(x = 1),
     "b" = data.frame(x = 2),
     "c" = data.frame(x = 3))

example_list[["d"]] <- rbindlist(example_list[c("a", "b", "c")])

Is it possible to create d at the same time as I create the original list? I would like to do something like this:

## this does not work
example_list <- list("a" = data.frame(x = 1),
     "b" = data.frame(x = 2),
     "c" = data.frame(x = 3),
     "d" = rbindlist(.[c("a", "b", "c")]))

Edit: I need to explicitly reference previous list entries, thus something like this would not work:

## ineligible
example_list <- list("a" = data.frame(x = 1),
     "b" = data.frame(x = 2),
     "c" = data.frame(x = 3),
     "d" = data.frame(x = 1) %>% 
       rbind(data.frame(x = 2)) %>% 
       rbind(data.frame(x = 3)))

CodePudding user response:

If we want to use a %>%, wrap it inside {}

library(dplyr)
library(data.table)
list("a" = data.frame(x = 1),
     "b" = data.frame(x = 2),
     "c" = data.frame(x = 3)) %>%
     {c(., d = list(rbindlist(.[c("a", "b", "c")])))}

In base R, we can get the data from a list using within.list

within.list(list("a" = data.frame(x = 1),
     "b" = data.frame(x = 2),
     "c" = data.frame(x = 3)), d <- rbindlist(list(a, b, c)))

-output

$a
  x
1 1

$b
  x
1 2

$c
  x
1 3

$d
   x
1: 1
2: 2
3: 3

CodePudding user response:

I don't think base R supports that (nor a package I can think of without similar hacks). I'm inferring that you want to do this without leaving individual frames (e.g., a, b) in the main environment, so we can use a local environment to do what we want.

example_list <- local({
  a <- data.frame(x = 1)
  b <- data.frame(x = 2)
  c <- data.frame(x = 3)
  d <- rbindlist(list(a, b, c))
  list(a=a, b=b, c=c, d=d)
})
  •  Tags:  
  • r
  • Related