【问题标题】:Setting global variables through a function通过函数设置全局变量
【发布时间】:2013-10-21 03:41:42
【问题描述】:

假设我有四个双打 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

【问题讨论】:

  • 如何为这些变量使用自定义environment 而不是在.GlobalEnv 中进行黑客攻击?或者您也可以遵循一些 OO 指南,尤其是参考类:adv-r.had.co.nz/R5.html
  • @daroczig 欢迎您发布答案,并附上这两种解决方案的示例,这听起来确实是一流的解决方案。

标签: r function environment-variables


【解决方案1】:

如果您正在使用脚本并且希望在您的工作区中使用这些全局变量,那么请使用 &lt;&lt;- 运算符:?"&lt;&lt;-" 不过要小心 - 这种方法假定您的关键变量不会以任何方式改变,除了你想要什么,并且不是很便携。

更新:如果您将 setAll 函数更改为 setAll &lt;- function(),则它应该可以工作 - 如果每次使用 &lt;&lt;- 运算符重置 X,则不需要参数。

【讨论】:

    【解决方案2】:

    如果您想将.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
    ...
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-26
      • 1970-01-01
      • 1970-01-01
      • 2016-06-16
      • 2017-01-23
      • 2019-10-03
      • 1970-01-01
      相关资源
      最近更新 更多