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

R 访问base::with()中未命名的列表元素,r,list,with-statement,R,List,With Statement,我的问题是这是否可能。给你一张单子 lst <- list(a = 1, 2) 我怀疑这是不可能的,因为with(lst,ls(all.names=TRUE))只给出“a”。但是有人知道不同的吗 我意识到为什么与(lst,2)不能工作。当然还有[[是一个函数,因此很明显,我的第一次尝试会混淆R。但是,with可以为未命名的参数指定特殊名称,这样它们就可以访问,而无需单独重新访问列表。例如,第二个元素可以在由设置的环境中调用.2使用。但情况并非如此 在本例中,只需使用lst[[2]]。但我

我的问题是这是否可能。给你一张单子

lst <- list(a = 1, 2)
我怀疑这是不可能的,因为
with(lst,ls(all.names=TRUE))
只给出
“a”
。但是有人知道不同的吗

我意识到为什么
与(lst,2)
不能工作。当然还有
[[
是一个函数,因此很明显,我的第一次尝试会混淆R。但是,
with
可以为未命名的参数指定特殊名称,这样它们就可以访问,而无需单独重新访问列表。例如,第二个元素可以在由设置的环境中调用
.2
使用
。但情况并非如此


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

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

lst <- list(a = 1, 2)
lst
中可以访问的唯一对象是
a

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

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

是的,在这种简单的情况下。如果您深入到一个多级列表中,使用一个包含一些命名和一些未命名元素的复杂表达式,则此方法非常有用。其目的是减少代码中所需的文本量。@akrun我提供了最简单的可复制示例。与编码一样,最简单的ample并没有说明我们为什么要费心处理复杂的代码,但它展示了一个可以应用于更复杂代码的原则。最简单问题的答案通常是不用费心处理代码,而是拿出算盘。
with
将计算移到其“data”参数内。而
lst
内的“a”与“a”不同在-say-
.GlobalEnv
中,数字“2”在两者中是相同的。而且,如果你想将实际数字“2”添加到
lst
的第二个元素中,那么
与(lst,2+2)
的关系应该是什么(a对应于
与(lst,a+2)
)明白吗?我意识到为什么
与(lst,2)
的关系永远不会起作用。当然
[[
是一个函数,因此很明显,我的第一次尝试会混淆R。但是,
with
可以为未命名的参数指定特殊名称,这样它们就可以访问,而无需单独重新访问列表。例如,第二个元素可以在环境设置b中调用
.2
y
。但情况并非如此。
eval(substitute(a), lst, enclos = parent.frame())
#[1] 1
eval(substitute(ls()), lst, enclos = parent.frame())
#[1] "a"