2013-10-13 254 views
1

假设我有四个双打a,b,c, d在我的脚本中的各个点将假定不同的实数。还假设所有四个双打都有以另一个双重为中心的值X。即,下面的关系必须始终坚持:通过函数设置全局变量

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

在我的剧本中,X值在不断变化。如何编写a,b,c,dX一起变化的功能?

创建以下setAll函数和调用每当X变化当然会无法正常工作,但在我想要的东西:

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

对于这样的变量使用自定义'environment'而不是在'.GlobalEnv'中进行黑客攻击?或者你也可以遵循一些面向对象的指导方针,特别是参考类:http://adv-r.had.co.nz/R5.html – daroczig

+0

@daroczig欢迎您以解决方案的例子发布答案,像高级解决方案。 – user2763361

回答

1

如果您正在使用脚本的工作精神和要在这些全局变量您的工作空间然后使用<<-运算符:?"<<-"请小心 - 这种方法假定您的关键变量不会以您想要的方式以外的任何方式进行更改,并且不是非常便于携带。

更新:如果你将其更改为setAll <- function()setAll功能应该工作 - 如果X<<-操作重置每次不需要争论。

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 

或者,你可能只是创建在面向对象编程的装置作为一种替代的解决方案参考类:

> 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 
... 

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