通过函数设置全局变量

时间:2013-10-13 13:04:29

标签: r function environment-variables

假设我有四个双打abcd,我的脚本中的不同点将采用不同的实数。还假设所有四个双精度值都以另一个名为X的双精度值为中心。即,必须始终保持以下关系:

  • a = X + 1
  • b = X + 5
  • c = X + 10
  • d = X + 15

在我的脚本中,X的值总是在变化。如何编写一个函数,使abcdX一起更改?

创建下面的setAll函数并在X更改时调用当然不起作用,但符合我的想法。

setAll <- function(X) {
    a = X + 1
    b = X + 5
    c = X + 10
    d = X + 15
}
setAll(100) #if X = 100

2 个答案:

答案 0 :(得分:5)

如果您希望将混乱保持在.GlovalEnv的最低级别,最好将所有这些变量保存在单独的环境中,例如:

> setAll <- function(X) {
+     if (!(exists('myParams') && is.environment(myParams))) {
+         myParams <- new.env()
+     }
+     myParams$a = X + 1
+     myParams$b = X + 5
+     myParams$c = X + 10
+     myParams$d = X + 15
+ }
> setAll(100) #if X = 100
> myParams$a
[1] 101

或者您可以通过OO编程方式创建一个引用类作为替代解决方案:

> myParam <- setRefClass('myParam', fields = list('X' = 'numeric', 'a' = 'numeric', 'b' = 'numeric', 'c' = 'numeric', 'd' = 'numeric'))
> myParam$methods(initialize = function(X, ...) {
+     .self$a <- X + 1
+     .self$b <- X + 5
+     .self$c <- X + 10
+     .self$d <- X + 15
+     callSuper(...)
+ })
> foo <- myParam(pi)
> foo$a
[1] 4.141593
> foo$b
[1] 8.141593
...

当然,这些只是初始和虚拟线框,但希望这对进一步的想法有用。

答案 1 :(得分:1)

如果您正在使用脚本并且希望在工作区中使用这些全局变量,那么请使用<<-运算符:?"<<-"但请注意 - 此方法假定您的关键变量不会被更改除了你想要的任何其他方式,并且不是很便携。

更新:如果您将setAll功能更改为setAll <- function(),则X功能应该有效 - 如果每次使用<<-运算符重置{{1}},则无需参数。