the*_*ist -1 environment scope r function
您是否必须在R中明确定义自定义函数的环境,还是在创建函数时自动"创建"(定义?)?
我想知道创建一个函数是否自动在所述函数中创建一个环境,或者是否需要显式创建环境.如果前者为真(即自动创建环境),我该如何明确引用它?
我必须首先为所述函数创建一个新环境(即,通过使用指定一个新环境new.env)或者我可以简单地使用其他一些语法(可能类似于" current.env()")吗?
我能想出的唯一一个简单的例子是assign函数内部的函数.
function(a,b) {
  assign(paste(a,b,sep='.'), 'help me', envir = ONLY CURRENT FUNCTION)
}
当前环境返回environment():
> environment()
<environment: R_GlobalEnv>
> foo <- function() environment()
> foo()
<environment: 0x1391b88>
> foo()
<environment: 0x1391f08>
> foo()
<environment: 0x1392288>
> foo()
<environment: 0x13916a0>
请注意,每个调用foo()具有不同的环境,因为您正在考虑的环境仅在调用函数时创建.
要获取调用函数的封闭框架,请使用parent.frame():
> bar <- function() parent.frame()
> bar()
<environment: R_GlobalEnv>
由于bar()是从我的工作区时,将返回地球环境.但是,如果我们bar()从另一个函数内部调用,我们得到该函数的环境,因为现在它是调用环境:
> foobar <- function() { print(environment()); bar() }
> foobar()
<environment: 0x74a7d68>
<environment: 0x74a7d68>
如果我们查看您的assign()示例,如果您想要当前环境,则不必告诉它使用哪个环境,因为默认情况下它是如何设置的.但是,如果你想明确这个,你会使用:
foo <- function(x) {
  assign("y", x, envir = environment())
  y # return(y) to show it is assigned `x`
}
这使
> foo(20)
[1] 20
> foo(10)
[1] 10
> foo("a")
[1] "a"
如果要在父框架中指定,只需传递envir = parent.frame():
foo <- function(x) {
  assign("y", x, envir = parent.frame())
  "not returning `y`" # return something else
}
这使
> ls()
[1] "bar"    "foo"    "foobar"
> foo(20)
[1] "not returning `y`"
> ls()
[1] "bar"    "foo"    "foobar" "y"     
> y
[1] 20
即使我们没有返回y,也是在我们指定的环境中assign()创建y的.
重要的是要强调尽管很少应该assign()像这样做,分配到其他环境.这样做的一个主要原因是,现在你的函数有副作用,而R是一种函数式语言,通过函数获取输入和返回输出更容易推理代码的工作原理,而不会影响其他任何东西.因此你更喜欢
foo1 <- function(x) {
  y <- x
  y
}
y <- foo1(x)
过度
foo2 <- function(x, varname) {
  assign(varname, x, envir = parent.frame())
  invisible()
}
foo2(x, "y")
因为我知道调用foo1()没有副作用,它只是采取一些输入并返回输出.这是一个有点做作,因为你选择了,assign()但这将广泛适用.这也是许多R函数返回复杂列表或其他类型对象的原因,尤其是那些适合模型的函数.