你的编码方式与功能范例非常相似。 R更经常用作脚本语言。所以,除非你确切地知道你在做什么,这是不好的做法是使用< < - 或包括在函数的函数。
您可以在功能环境章节找到解释here。
环境是一个空间/帧在那里执行代码。环境可以嵌套,就像功能一样。
创建功能时,您有附加的机柜环境,可由environment
调用。这是封闭的环境。
该函数在另一个环境中执行,执行环境采用全新的启动原则。执行环境是封闭环境的子环境。
对于为例,我的笔记本电脑:
> environment()
<environment: R_GlobalEnv>
> environment(f$increment)
<environment: 0x0000000022365d58>
> environment(f$get_i)
<environment: 0x0000000022365d58>
f是位于全球环境的对象。
功能increment
贴有封闭环境0x0000000022365d58,函数factory
的执行环境。
我从哈德利引用:
当另一个函数内部创建一个函数,封闭 环境中的孩子的功能是 父的执行环境,执行环境不再是短暂的。
执行函数f时,将使用其中的my_list
对象创建封闭环境。
可与ls
命令进行评估:
> ls(envir = environment(f$increment))
[1] "my_list"
> ls(envir = environment(f$get_i))
[1] "my_list"
的<<-
运营商在父母搜索环境中使用的变量。在这种情况下,找到的my_list
对象是紧邻上层环境中的对象,它是该函数的封闭环境。
因此,当增量作出时,它只在该环境中而不在全局中。
您可以通过在更换increment
功能看它:
my_list$increment <- function() {
print("environment")
print(environment())
print("Parent environment")
print(parent.env(environment()))
my_list$i <<- my_list$i + 1
}
它给我:
> f$increment()
[1] "environment"
<environment: 0x0000000013c18538>
[1] "Parent environment"
<environment: 0x0000000022365d58>
您可以使用get
来访问你的结果,一旦你已经存储环境名称:
> my_main_env <- environment(f$increment)
> get("my_list", env = my_main_env)
$i
[1] 2
$increment
function()
{
print("environment")
print(environment())
print("Parent environment")
print(parent.env(environment()))
my_list$i <<- my_list$i + 1
}
<environment: 0x0000000022365d58>
$get_i
function()
{
print("environment")
print(environment())
print("Parent environment")
print(parent.env(environment()))
my_list$i
}
<environment: 0x0000000022365d58>
来源
2017-06-29 12:47:16
YCR
是不是你只是改变'my_list $ i'的值而不是'f $ i'的值?这些不是同一个变量。如果'my_list'存在于全局环境中,它的'i'参数会被改变,但是你不会改变'f'对象的任何项目 – Cath
谢谢 - 是的,它们不是同一个变量,这是令人惊讶的。 我猜我试图理解_why_他们不是同一个变量。我们在R中看到的行为与JavaScript中发生的行为不同。 – RobinL
对不起,这是微不足道的答案,但我仍然认为这是它的原因:它只是不同的名称(尽管两个“代表”相同的变量) – Cath