在定义新常量更新时,其他常量的名称

时间:2014-03-18 13:44:11

标签: r

我有一些逻辑可以测试值的变化。当达到一定的阈值时,新的常数声称第一个点,即s0,其余的被“推上”意味着第一个变为第二个,第二个变为第三个......这是一个例子:

我的数据的初始状态可能如下所示:

s3 <- 7
s2 <- 5
s1 <- 4
s0 <- 2

运行一些测试并将s0重新定义为较低的值,如s0 = 1.此时我的变量需要向上移动并添加一个新的“级别”,如下所示:

s4 <- 7
s3 <- 5
s2 <- 4
s1 <- 2
s0 <- 1

我知道如何重新定义s0,但我不确定如何相应地调整其他常量的名称。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

您应该将所有这些值放在一个向量中,而不是存储为单独的对象。

初始状态:

state <- c(2, 4, 5, 7)

如果new_value小于之前的所有值,则更新状态:

if (new_value < min(state)) state <- sort(c(state, new_value))

然后,您始终可以通过state[1]引用当前最小值。

答案 1 :(得分:2)

效率不高,我不推荐这种方法。如评论/回答,您应该将变量放在相同的结构(列表或向量)中。我之所以展示它只是因为解决方案使用了一些有用的函数来处理全局环境中的变量定义(从单独的变量切换到列表,反之亦然)。

据说,在这里我定义了一个完成这项工作的功能。它定义了一个新的s0并移动了其他变量的名称。在内部,该函数创建一个列表(通过使用某种模式收集变量),移动其名称并再次向全局环境返回一个单独的变量。

push <- function(value){
  ## call of gloabl variable twice here , once for ls and for mget
  ## not really elegant!
  oo = mget(ls(pattern='s[0-9]+',envir=.GlobalEnv),envir=.GlobalEnv)
  list2env(setNames(c(value,oo),c(names(oo),paste0('s',length(oo)))),
           envir=.GlobalEnv)
}

然后你可以像这样重新定义一个新的s0:

push(1)

您测试结果:

unlist(mget(ls(pattern='s[0-9]+')))
s0 s1 s2 s3 s4 
 1  2  4  5  7