R - 改变功能环境

时间:2016-06-24 15:34:46

标签: r

我是R的新用户,我想知道是否可以这样做:

a = 2                     <environment: R_GlobalEnv>

f <- function(){
  x = 1
  y = 1
  g()
}                         <environment: 0xf1b79b8>

g <- function(){
  z = x + y + a
}                         <environment: 0xf1b7a98>
Error in g() : object 'x' not found

问题:是否可以为全球和g()环境创建f()个性化访问权限?

2 个答案:

答案 0 :(得分:5)

执行此操作的一种方法是在 g()内定义f()

a <- 2

f <- function(){
    g <- function(){
       z <- x + y + a
   }    
   x <- 1
   y <- 1
   g()
}

print(f())  ## 4

答案 1 :(得分:3)

如果只是希望函数能够从父框架中获取变量,或者如果没有找到,则从全局环境中获取变量,这应该可行(即使我不鼓励*):

g <- function(env=parent.frame()){
  z = get("x",envir=env) + get("y",envir=env) + get("a",envir=env)
  return(z)
}

所以,这有效:

rm(list=ls(pattern='[^g]')) # to be sure the global env is empty except for g function
a = 2                     

f <- function(){
  x = 1
  y = 1
  return(g())
} 

f()
# returns 4

(*)我不鼓励这主要有两个原因:

  1. 代码不易阅读,并且无法立即清楚g做了什么以及需要xya
  2. 从功能编程的角度来看,一个好的做法是使函数尽可能“自包含”(即不依赖于外部/全局变量)和尽可能“无状态”(即不保留任何“状态”)所谓的)。通过参数传递函数需要的东西要好得多,让函数只是接收输入(通过参数),操作它并返回输出。