访问 base::with() 中的未命名列表元素

Accessing unnamed list elements inside base::with()

我的问题是这是否可能。给定一个列表

lst <- list(a = 1, 2)

可以将 with(lst, a) 到 return 第一个元素。但是你可以 return 第二个元素使用 with 而不先命名它吗?

无效:

with(lst, [[2]])
with(lst, `2`)
with(lst, ..2)

我怀疑这是不可能的,因为 with(lst, ls(all.names = TRUE)) 只给出了 "a"。但是有谁知道有什么不同吗?

我明白为什么 with(lst, 2) 永远行不通了。当然 [[ 是一个函数,所以很明显我的第一次尝试会使 R 感到困惑。但是,with 可以为未命名的参数赋予特殊名称,这样就可以访问它们而无需单独重新访问列表。例如,第二个元素可以在 with 设置的环境中调用 ..2。但事实并非如此。

在此示例中,只需使用 lst[[2]]。但是我正在考虑一个大型多级列表的复杂表达式,其中一些元素被命名,而另一些则没有。使用 with 语句从方便的子集级别开始,代码将更具可读性。但是让一些需要的元素未命名是一个障碍。

不,这是不可能的。您不能从列表中引用未命名的对象。

lst <- list(a = 1, 2)

这就是 with 的作用:

eval(substitute(a), lst, enclos = parent.frame())
#[1] 1

可从 lst 中访问的唯一对象是 a:

eval(substitute(ls()), lst, enclos = parent.frame())
#[1] "a"

我建议命名列表的所有组件。 (老实说,我真的没有看到一个常见的用例。)