代码之家  ›  专栏  ›  技术社区  ›  Hanjo Odendaal

使创建的变量在r的父环境中可用

r
  •  2
  • Hanjo Odendaal  · 技术社区  · 7 年前

    R 创建新变量。我需要的是能够在父环境中使用这些变量,而不是全局的。

    例如,一种解决方案是使用全局赋值运算符 <<- :

    f1 <- function(x){
    
      cat("X is ", x, "\n")
      f2 <- function(){
        cat("X will now be transfromed\n")
        y <<- x + 4 # Use Global assignment
      }
    
      f2()
    
      cat("Y is ", y, "\n")
    } 
    f1(x = 5)
    

    我想知道是否有一个更好的解决方案,而不必玩的概念,如 vars_to_parent <- new.env() .

    `<p-` <- function(){assign variable in such a way that its available in parent}
    

    这可以帮助您将这些新创建的变量放到父环境中:

    f1 <- function(x){
    
      cat("X is ", x, "\n")
      f2 <- function(){
        cat("X will now be transfromed\n")
        y <p- x + 4 # New cool assignment operator
      }
    
      f2()
    
      cat("Y is ", y, "\n")
    } 
    f1(x = 5)
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   G. Grothendieck    7 年前

    最后一行 f 将复制中的所有变量 f as.list(environment()) 具有 list("a", "b") 或者只复制以小写字母开头的变量, as.list(ls(pattern = "^[a-z]"))

    if (exists("a")) rm(a)
    if (exists("b")) rm(b)
    
    f <- function(envir = parent.frame()) {
      a <- b <- 1
      invisible( list2env(as.list(environment()), envir) )
    }
    f()
    a
    ## [1] 1
    b
    ## [1] 1
    

    f2 <- function(envir = parent.frame()) {
      a <- b <- 1
      environment()
    }
    e <- f()
    e$a
    ## [1] 1
    e$b
    ## [1] 1
    

    或者通过将f2中的最后一条语句替换为以下语句来返回列表:

    list2env(environment())