![](/img/trans.png)
[英]R: Make named items in ellipsis available in (maybe nested) execution environment
[英]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.