how to add value to existing variable from inside a loop?

为君一笑 提交于 2019-12-13 08:37:20

问题


I want to add a computed value to an existing vector from within a loop in which the wanted vector is called from within the loop . that is im looking for some function that is similar to assign() function but that will enable me to add values to an existing variables and not creating new variables.

example: say I have 3 variabels :

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

and now I want to access the last value in each of the variabels, double it and add the resault to the vector:

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

the problem here is that "name" is a string, how can R identify it as a veriable name and access it?


回答1:


What you are asking for is something like this:

get(name)

In your code it would like this:

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

Does that help you in any way?

However, I agree with the other answer, that lists and the lapply/sapply-functions are better suited!




回答2:


This is how you can do this with a list:

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

You can then access the list elements as described in help("["), i.e., mylist$sp1, mylist[["sp1"]], etc.

Of course, this is still very inefficient code and it could be improved a lot. E.g., since all three variables are of same type and length, they really should be combined into a matrix, which could be filled with one call to rnorm and which would also allow doing the second operation with vectorized operations.




回答3:


@Roland is absolutely right and you absolutely should use a list for this type of problem. It's cleaner and easier to work with. Here's another way of working with what you have (It can be easily generalised):

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

EDIT: If you are truly, sincerely dedicated to doing this despite being recommended otherwise, you can do it this way:

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


来源:https://stackoverflow.com/questions/33805491/how-to-add-value-to-existing-variable-from-inside-a-loop

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!