假设我有四个双打a
,b
,c
,d
,我的脚本中的不同点将采用不同的实数。还假设所有四个双精度值都以另一个名为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
答案 0 :(得分: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
...
当然,这些只是初始和虚拟线框,但希望这对进一步的想法有用。
答案 1 :(得分:1)
如果您正在使用脚本并且希望在工作区中使用这些全局变量,那么请使用<<-
运算符:?"<<-"
但请注意 - 此方法假定您的关键变量不会被更改除了你想要的任何其他方式,并且不是很便携。
更新:如果您将setAll
功能更改为setAll <- function()
,则X
功能应该有效 - 如果每次使用<<-
运算符重置{{1}},则无需参数。