如何解决在R中运行时是否可以设置函数的环境?
如果定义函数,则默认情况下它们都是Global Environment
的一部分。
我想知道是否有一种方法可以将函数的父环境设置为调用环境(同时
运行时-函数可能在不同的地方被调用!)。因此,在嵌套函数的情况下,
应该有可能只在一个环境中定义一个变量,我希望有一个像这样的例子
fun1 <- function() {
# variable "my_env" defined only in this environment
subfun() # calls subsubfun()
return(NULL)
}
exists("my_env",different_environments)
的输出,例如
# [1] "fun1"
# [1] "===="
# [1] TRUE # Only here: "here",in this function
# [1] FALSE
# [1] FALSE
# [1] " subfun"
# [1] " ======"
# [1] FALSE
# [1] TRUE # Only here: "parent environment",in calling function
# [1] FALSE
# [1] " subsubfun"
# [1] " ========="
# [1] FALSE
# [1] FALSE
# [1] TRUE # Only here: "parent-parent environment",in the function calling the function
从文档?parent.frame
sys.parent 返回父帧的编号,如果n为1( 默认值),则祖父母是否n为2,依此类推。另请参见“注释”。
(...) parent.frame(n)是 sys.frame(sys.parent(n))(实现起来效率更高)。注意
严格地, sys.parent 和 parent.frame 是指 父解释函数。因此内部功能(可能是 可能未设置上下文,因此可能不会出现在调用堆栈中) 可能不算在内,S3方法也可以做令人惊讶的事情。 当心懒惰评估的效果:这两个函数来看 评估时调用堆栈,而不是评估时 叫做。将调用作为函数参数传递给它们不太可能 是个好主意。
从here开始的某些示例不起作用,因为所有功能都是全局环境的一部分。
subfun0 <- function() {
e <- parent.frame()
attr(e,"name") <- "my_env"
assign("my_env",1,envir = parent.frame(),inherits = FALSE,immediate = TRUE)
return(NULL)
}
subsubfun <- function() {
print(" subsubfun")
print(" =========")
print(exists("my_env"))
print(exists("my_env",parent.frame()))
env <- parent.frame()
print(exists("my_env",parent.env(env)))
return(NULL)
}
subfun <- function() {
print(" subfun")
print(" ======")
print(exists("my_env"))
print(exists("my_env",parent.env(env)))
subsubfun()
return(NULL)
}
fun1 <- function() {
print("fun1")
print("====")
subfun0()
print(exists("my_env"))
print(exists("my_env",parent.env(env)))
subfun()
return(NULL)
}
fun1()
(我刚刚意识到,我对“呼叫环境”的印象完全错误,我的问题是,我能否在R中使用“我的图像”。)
解决方法
使用此代码,您可以获得所需的确切信息:
subfun0 <- function() {
e <- parent.frame()
attr(e,"name") <- "my_env"
assign("my_env",1,envir = parent.frame(),inherits = FALSE,immediate = TRUE)
return(NULL)
}
subsubfun <- function() {
print(" subsubfun")
print(" =========")
print(exists("my_env"))
print(exists("my_env",parent.frame()))
print(exists("my_env",parent.frame(2)))
return(NULL)
}
subfun <- function() {
print(" subfun")
print(" ======")
print(exists("my_env"))
print(exists("my_env",parent.frame(2)))
subsubfun()
return(NULL)
}
fun1 <- function() {
print("fun1")
print("====")
subfun0()
print(exists("my_env"))
print(exists("my_env",parent.frame(2)))
subfun()
return(NULL)
}
fun1()
[1] "fun1"
[1] "===="
[1] TRUE
[1] FALSE
[1] FALSE
[1] " subfun"
[1] " ======"
[1] FALSE
[1] TRUE
[1] FALSE
[1] " subsubfun"
[1] " ========="
[1] FALSE
[1] FALSE
[1] TRUE
NULL
重点在于:parent.frame(2)
不等于parent.env(parent.frame())
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。