0

我提前为这个问题道歉,但我看起来很努力并且无法找到解决方案。

如何在变量中由 for 循环生成的值?

例如:

myfunction <- function(x=1:5) {
                for(i in 1:length(x)) {
                r<-x[i]
                }
                print(r)
              }

如果我运行上面的代码,我只会得到 x 的最后一个值,在这种情况下是 5。我知道这是因为我每次都通过 for 循环覆盖 r。

我也试过:

myfunction <- function(x=1:5) {
                for(i in 1:length(x)) {
                r[i]<-x[i]
                }
                print(r)
              }

但我仍然只是得到最后一个值。

我发现的唯一解决方案是在使用 r<-numeric(length) 之前指定将保存生成值的变量的长度:

myfunction <- function(x=1:5) {
                r<-numeric(5)
                for(i in 1:length(x)) {
                r[i]<-x[i]
                }
                print(r)
              }

但是如果我事先不知道要返回的向量的长度,这个解决方案显然是不够的。

谢谢你的帮助!

4

3 回答 3

2

你的循环只经过一次,它是 i = length(x)。你可能想要

for(i in seq(length(x))){
    # code here
}

# or

for(i in seq_along(x)){
    # code here
}
于 2012-10-05T01:44:37.207 回答
1

您可以初始化一个长度为 0 的向量,然后将值附加到它上面。如果您有数千个文件,这将是低效的,只有几百个应该没问题。

myfunction <- function(){
    my_vector <- vector(mode = "numeric", length = 0)
    for( i in 1:400){
        x <- read.csv("my_file")    #add code to read csv file.
        #Say the file has two columns of data you want to compute the correlation
        temp_cor <- cor(x[,1], x[,2])
        my_vector <- c(my_vector, temp_cor)
    }
    return(my_vector)

}

R Inferno的第 2 章有很好的关于增长向量的信息。

于 2012-10-05T12:15:13.800 回答
0
holder <- c()#generating empty vector
x <- (1:5) #generting somthing to loop

for (i in seq_along(x)){ #loop through x
     holder <- c(holder,i*2)#and put it into holder
  }

print(holder)
于 2017-03-01T04:43:16.210 回答