2013-10-13 306 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 
... 

當然,這些只是初始和虛設引線框架,但希望這將是進一步的想法是有用的。