use*_*361 1 r function environment-variables
假设我有四个双打a,b,c,d,在不同的点在我的脚本将承担不同的实数.还假设所有四个双精度值都以另一个双精度值为中心X.即,必须始终保持以下关系:
a = X + 1b = X + 5c = X + 10d = 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)
如果您希望将杂波保持在最低水平.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)
当然,这些只是初始和虚拟线框,但希望这对于进一步的想法是有用的.