访问base :: with()

时间:2016-08-17 09:24:22

标签: r list with-statement

我的问题是这是否可行。给出一个列表

lst <- list(a = 1, 2)

可以让with(lst, a)返回第一个元素。但是你可以使用with返回第二个元素而不先命名吗?

不能工作:

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

我怀疑这是不可能的,因为with(lst, ls(all.names = TRUE))仅提供"a"。但有人知道不同吗?

我意识到为什么with(lst, 2)永远无法奏效。当然[[是一个函数,所以很明显我的第一次尝试会混淆R.但是,with为未命名的参数赋予特殊名称是可行的,这样它们就可以在没有单独重新访问列表。例如,可以在..2设置的环境中将第二个元素称为with。但事实并非如此。

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

1 个答案:

答案 0 :(得分:2)

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

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"

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