是否有可能使函数识别它们上面的变量?

时间:2012-07-31 00:44:54

标签: r

我在R工作,我想做,例如,

printx <- function() {
  x <- 1
  printy()
  return(x)
}

printy <- function() {
  print(x)
}

因为我不想继续传递大量变量(同样,全局环境中没有x)。有没有办法做到这一点?所有函数都可以访问全局环境,但是函数环境和全局环境之间的函数呢?

2 个答案:

答案 0 :(得分:5)

也许

printx <- function() {
  x <- 1
  printy()
  return(x)
}

printy <- function() {
  print(get('x',envir=parent.frame()))
}

> x<-0
> printy()
[1] 0
> printx()
[1] 1
[1] 1

这将使用x来打印printy,该e1<-new.env(parent = baseenv()) > assign('x',12,envir=e1) > x [1] 0 > get('x',e1) [1] 12 与调用该函数的环境相关联。

另一种可能性是创建一个新环境

{{1}}

答案 1 :(得分:3)

您可以使用闭包来获得类似的结果,而不会产生与上述风险相关的风险。如果不知道你想要做什么,很难提出一个相关的例子。但下面的代码可能会引起人们的兴趣...

create.functions <- function(x){
    list(
        function() x,
        function() x+1,
        function() x^2
    )

}

x <- 0

f1 <- create.functions(5)
f1[[1]]()
[1] 5
f1[[2]]()
[1] 6
f1[[3]]()
[1] 25

f2 <- create.functions(3)
f2[[1]]()
[1] 3
f2[[2]]()
[1] 4
f2[[3]]()
[1] 9

x
[1] 0

请注意,您可以创建一组共享相同参数x的函数,而不会在参数x和全局环境中的x值之间产生任何冲突。如果您需要一组新的函数,其中x的参数定义不同,您只需创建一个新集。

甚至可以这样做,以便在更改参数值时无需编辑依赖于函数套件的代码:

f <- create.functions(5)
f[[1]]()/f[[3]]()
[1] 0.2

f <- create.functions(3)
f[[1]]()/f[[3]]()
[1] 0.3333333

请注意,同一行代码f[[1]]()/f[[3]]()会根据参数x的定义方式返回不同的结果。