1

假设我有四个双打a, b, cd在我的脚本中的不同点将假设不同的实数。还假设所有四个双精度值都以另一个名为 的双精度值为中心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
4

2 回答 2

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

或者您可能只是以 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
...

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

于 2013-10-13T14:28:10.430 回答
1

如果您正在使用脚本并且希望在您的工作区中使用这些全局变量,那么请使用<<-操作符:?"<<-" 但要小心 - 这种方法假定您的关键变量不会以任何方式改变,而不是您想要的,并且不是很便携.

更新:setAll如果您将其更改为,您的函数应该可以工作- 如果每次使用操作员重置setAll <- function(),则不需要参数。X<<-

于 2013-10-13T13:07:40.200 回答