在将列表存储为对象之前引用列表中的其他项目

Posted

技术标签:

【中文标题】在将列表存储为对象之前引用列表中的其他项目【英文标题】:Referencing other items in a list before it is stored as an object 【发布时间】:2022-01-23 04:27:45 【问题描述】:

我有一个列表,想创建一个新的列表条目d,方法是将现有列表条目绑定在一起,如下所示:

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")])

是否可以在创建原始列表的同时创建d?我想做这样的事情:

## 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")]))

编辑:我需要明确引用以前的列表条目,因此这样的事情不起作用:

## 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)))

【问题讨论】:

【参考方案1】:

我认为 base R 不支持这一点(也没有我能想到的没有类似 hack 的包)。我推断您希望这样做而不在主环境中留下单个帧(例如,ab),因此我们可以使用local 环境来做我们想做的事情。

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)
)

【讨论】:

【参考方案2】:

如果我们想使用%&gt;%,请将其包裹在

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")])))

base R中,我们可以使用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)))

-输出

$a
  x
1 1

$b
  x
1 2

$c
  x
1 3

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

【讨论】:

以上是关于在将列表存储为对象之前引用列表中的其他项目的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python 删除对象列表中的重复项

将列表附加到 R 中的列表列表

为啥在将项目附加到现有列表时会得到“无”项目? [复制]

Python - 有效地检查列表中的每个项目与其他项目

可变序列与不可变序列

我们是不是应该在将图像设置为 UITableView 中的 imageView 之前缩放图像