2

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

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

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

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

4

2 回答 2

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
于 2012-07-31T00:58:15.967 回答
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 的定义方式返回不同的结果。

于 2012-07-31T01:45:03.170 回答