我在R工作,我想做,例如,
printx <- function() {
x <- 1
printy()
return(x)
}
printy <- function() {
print(x)
}
因为我不想继续传递大量变量(同样,全局环境中没有x)。有没有办法做到这一点?所有函数都可以访问全局环境,但是函数环境和全局环境之间的函数呢?
答案 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的定义方式返回不同的结果。