如何从循环内部向现有变量添加值?

时间:2015-11-19 13:37:43

标签: r loops variable-assignment dynamic-programming

我想在一个循环中向现有向量添加一个计算值,在循环中从循环中调用所需向量。即我正在寻找一些类似于assign()函数的函数,但这将使我能够将值添加到现有变量而不创建新变量。

例如: 说我有3个变量:

sp=3
for(i in 1:sp){
    name<-paste("sp",i,sep="")
    assign(name,rnorm(5))
}

现在我想访问每个变量标题中的最后一个值,加倍并将该数据库添加到向量中:

for(i in 1:sp){
    name<-paste("sp",i,sep="")
    name[6]<-name[5]*2
}

这里的问题是“name”是一个字符串,R如何将其识别为可靠的名称并访问它?

3 个答案:

答案 0 :(得分:2)

你要求的是这样的:

get(name)

在你的代码中它会这样:

v <- 1:10
var <- "v"

for (i in v){
  tmp <- get(var)
  tmp[6] <- tmp[5]*2
  assign(var, tmp)
}
# [1]  1  2  3  4  5 10  7  8  9 10

这对你有什么帮助吗?

但是,我同意另一个答案,列表和lapply / sapply函数更适合!

答案 1 :(得分:1)

这是使用列表执行此操作的方法:

int main() {

  char* rebecca = concat("rebecca", 1);
  char* bill = concat("bill", 2);

  Write(rebecca);  /* bill2ca1 */
  Write(bill);     /* bill2ca1 */
}

然后,您可以按sp=3 mylist <- vector(mode = "list", length = sp) #initialize a list names(mylist) <- paste0("sp",seq_len(sp)) #set the names for(i in 1:sp){ mylist[[i]] <- rnorm(5) } for(i in 1:sp){ mylist[[i]] <- c(mylist[[i]], mylist[[i]][5] * 2) } mylist #$sp1 #[1] 0.6974563 0.7714190 1.1980534 0.6011610 -1.5884306 -3.1768611 # #$sp2 #[1] -0.2276942 0.2982770 0.5504381 -0.2096708 -1.9199551 -3.8399102 # #$sp3 #[1] 0.235280995 0.276813498 0.002567075 -0.774551774 0.766898045 1.533796089 中所述访问列表元素,即help("[")mylist$sp1等。

当然,这仍然是非常低效的代码,并且可以进行很多改进。例如,由于所有三个变量具有相同的类型和长度,它们实际上应该组合成一个矩阵,可以通过一次调用填充mylist[["sp1"]],这也可以允许使用矢量化操作进行第二次操作。

答案 2 :(得分:0)

@Roland是绝对正确的,你绝对应该使用列表来解决这类问题。它更干净,更容易使用。这是处理你所拥有的另一种方式(可以很容易地推广):

sp <- replicate(3, rnorm(5), simplify=FALSE)
names(sp) <- paste0("sp", 1:3)
sp

#$sp1
#[1] -0.3723205  1.2199743  0.1226524  0.7287469 -0.8670466
#
#$sp2
#[1] -0.5458811 -0.3276503 -1.3031100  1.3064743 -0.7533023
# 
#$sp3
#[1]  1.2683564  0.9419726 -0.5925012 -1.2034788 -0.6613149

newsp <- lapply(sp, function(x){x[6] <- x[5]*2; x})
newsp

#$sp1
#[1] -0.3723205  1.2199743  0.1226524  0.7287469 -0.8670466 -1.7340933
#
#$sp2
#[1] -0.5458811 -0.3276503 -1.3031100  1.3064743 -0.7533023 -1.5066046
#
#$sp3
#[1]  1.2683564  0.9419726 -0.5925012 -1.2034788 -0.6613149 -1.3226297

编辑:如果你是真的,真诚地致力于这样做,尽管另有建议,你可以这样做:

for(i in 1:sp){
  name<-paste("sp",i,sep="")
  assign(name, `[<-`(get(name), 6, `[`(get(name), 5) * 2))
}