R 在一个环境中工作,等同于in()、attach()等?

R 在一个环境中工作,等同于in()、attach()等?,r,closures,R,Closures,我想向搜索路径添加一个环境,并在有限的代码块中修改该环境中变量的值,而无需在每次引用变量时指定环境的名称:例如,给定环境 ee <- list2env(list(x=1,y=2)) 我能想到的大多数解决方案都是明确设计的,而不是修改环境的,例如 ?附加:“数据库实际上没有附加。而是一个新环境 是在搜索路径上创建的…” within():获取列表或数据帧(不是环境)“…并对“数据”的副本进行相应的修改” 由于@Nuclear03020704,有两个问题!我认为with()一直是我想要的;

我想向搜索路径添加一个环境,并在有限的代码块中修改该环境中变量的值,而无需在每次引用变量时指定环境的名称:例如,给定环境

ee <- list2env(list(x=1,y=2))
我能想到的大多数解决方案都是明确设计的,而不是修改环境的,例如

  • ?附加:
    “数据库实际上没有附加。而是一个新环境 是在搜索路径上创建的…”
  • within()
    :获取列表或数据帧(不是环境)“…并对“数据”的副本进行相应的修改”

  • 由于@Nuclear03020704,
    有两个问题!我认为
    with()
    一直是我想要的;我错误地假设它还将创建环境的本地副本,但它仅在
    数据
    参数为而不是环境时才会这样做

    ee <- list2env(list(x=1,y=2))
    with(ee, {
        x <- x+1
        y <- y+2
        z <- 6
    })
    
    这似乎是可行的,但也似乎很奇怪/神秘!我不想向使用R不到10年的人解释它。。。我想我可以在此基础上在_environment()中编写一个
    ,但我必须非常小心地正确捕获表达式,而不计算它…

    那么
    with()
    呢?从

    with(数据、表达式)

    数据
    是用于构建环境的数据。对于默认的with方法,它可以是环境、列表、数据帧或整数

    expr
    是要计算的表达式

    with
    是一个通用函数,用于在由数据构造的本地环境中计算
    expr
    。环境将调用方的环境作为其父环境。这对于简化对建模函数的调用非常有用。(注意:如果
    data
    已经是一个环境,则该环境将与其现有父环境一起使用。)

    请注意,
    expr
    中的分配发生在构造的环境中,而不是在用户的工作区中

    with()
    返回计算的
    expr
    的值



    ee捕获环境并没有那么棘手,是吗?例如,我认为在_环境中
    ,但我认为这不会通过CRAN检查。当包代码使用非标准求值时,这些检查似乎不喜欢它。我猜这应该是一个用户专用的便利。公式中未明确定义的符号通常会导致问题。但是我很好奇是否有人知道反例。
    globalVariables()
    应该会处理这个问题(尽管Martin Maechler不喜欢它,更喜欢
    x
    和()
    ?上面说,
    with
    可以把环境作为它的论据吗?不过我真的不知道你在做什么,所以如果这与你想要的还不接近,我很抱歉。你可能是对的!@Nuclear03020704,如果你想把它作为一个答案,我会接受的。
    in_environment(ee, {
        x <- x+1
        y <- y+2
        z <- 6
    })
    
    clfun <- function() {
       x <- 1
       y <- 2
       function(...) {
          x <<- x + 1   
          y <<- y * 2
       }
    }
    myfun <- clfun()
    
    ee <- list2env(list(x=1,y=2))
    with(ee, {
        x <- x+1
        y <- y+2
        z <- 6
    })
    
    myfun <- function() {
        eval(quote( {
            x <- x+1
            y <- y*2
            z <- 3
        }), envir=ee)
    }
    
    ee <- list2env(list(x=1,y=2))
    with(ee, {
        x <- x+1
        y <- y+2
        z <- 6
    })