R 替换非局部列表中的值的赋值

R 替换非局部列表中的值的赋值,r,list,environment,assign,R,List,Environment,Assign,(第2.1.10节)中说: 与大多数其他R对象不同,传递时不会复制环境 在作业中使用或使用功能 第6.3节“关于评估的更多信息”也给出了一个稍微相关的提示: 请注意,给定环境中的评估实际上可能会改变这一点 环境,最明显的是在涉及任务的情况下 操作员,例如 eval(quote(total <- 0), environment(robert$balance)) # rob Rob eval(total)(这是一个很好的问题,但我只想指出上述行为对$@nrussell同样适用是的,我考虑提到

(第2.1.10节)中说:

与大多数其他R对象不同,传递时不会复制环境 在作业中使用或使用功能

第6.3节“关于评估的更多信息”也给出了一个稍微相关的提示:

请注意,给定环境中的评估实际上可能会改变这一点 环境,最明显的是在涉及任务的情况下 操作员,例如

eval(quote(total <- 0), environment(robert$balance)) # rob Rob

eval(total)(这是一个很好的问题,但我只想指出上述行为对
$@nrussell同样适用是的,我考虑提到
$
,但根据文档,它的语义被定义为等同于
[[I,exact=FALSE]]
,赋值也是一样。所以,为了理解,内部发生的事情是:(1)对象被传递到
[[顺便提一下,这是我第二个问题的另一个解决方案,受你引用的段落启发:
eval.parent(bquote({lst['x']=(value)}))
。别担心,我不会用这个。pIn case of list,你可以想到
[[但请注意,
[@Roland你的评论说“case of list,…”——但事实上(这就是为什么整个行为一致的原因)不仅仅是列表,它适用于每种类型的对象,包括环境。我们可以通过稍微修改我的原始函数来验证这一点:
(函数(){env[['x']]=1;get('env',inherits=FALSE)})(
-这将返回由
创建的
env
的本地副本[[
lst
# list()

as.list(env)
# $x
# [1] 1
(function () lst[['x']] <<- 1)()
`[[<-` = function (x, i, value) {
    if (exists(x, mode = 'environment', inherits = TRUE))
        assign(i, value, pos = x, inherits = FALSE)
    else if (exists(x, inherits = FALSE)
        internal_assign(x, i, value)
    else
        assign(x, list(i = value), pos = parent.frame(), inherits = FALSE)
}
eval(quote(total <- 0), environment(robert$balance)) # rob Rob