通过函数设置全局变量

use*_*361 1 r function environment-variables

假设我有四个双打a,b,c,d,在不同的点在我的脚本将承担不同的实数.还假设所有四个双精度值都以另一个双精度值为中心X.即,必须始终保持以下关系:

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

在我的脚本中,值X始终在变化.我怎样写一个函数,使得a,b,c,d一起改变X

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

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

dar*_*zig 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
Run Code Online (Sandbox Code Playgroud)

或者您可以通过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
...
Run Code Online (Sandbox Code Playgroud)

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