繁体   English   中英

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

[英]make created variable available in parent environment in r

我在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)

但是我有超过 20 个变量,所以这会使我的工作区变得混乱并且是不好的做法。

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

是否有一些优雅的R魔法,你有一个新的赋值运算符,也许是一些愚蠢的东西,比如:

`<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)

f的最后一行将把f中的所有变量复制到指定的环境中。 或者,将as.list(environment())替换为list("a", "b")或仅复制以小写字母开头的变量,例如as.list(ls(pattern = "^[az]"))

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())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM