【问题标题】:R: Hold Values Generated in For LoopR:保持在 For 循环中生成的值
【发布时间】:2012-10-05 01:38:25
【问题描述】:

我提前为这个问题道歉,但我已经很难找到解决方案。

如何在变量中生成由 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 之前指定将保存生成值的变量的长度

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

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

感谢您的帮助!

【问题讨论】:

  • print 打印值,它不保存任何内容,最后一个解决方案是正确的解决方案,如果您使用 for 循环,您将始终知道长度,例如 r &lt;- numeric(length(x)) - 但希望您的函数比这更复杂,因为x &lt;- r 会做你想做的事情,否则(不需要循环)你的 for 循环也会评估为for i in 5,这就是为什么只有 1 个值!
  • 我真正的问题是我正在遍历一个目录,并且我想将每个文件中两列的相关性放在一个向量中,但前提是它们具有一定数量的非缺失值.在运行循环之前,我不知道有多少文件超过了阈值。
  • 使用 lapply 并运行一个匿名函数来进行关联(或在必要时返回 NA),不需要(显式)循环!

标签: r function vector for-loop


【解决方案1】:

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

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

# or

for(i in seq_along(x)){
    # code here
}

【讨论】:

    【解决方案2】:

    你可以初始化一个长度为 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 章有很好的关于增长向量的信息。

    【讨论】:

      【解决方案3】:
      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)
      

      【讨论】:

      • 你有什么问题?
      猜你喜欢
      • 1970-01-01
      • 2014-11-15
      • 1970-01-01
      • 2014-07-17
      • 1970-01-01
      • 2018-05-08
      • 1970-01-01
      • 2017-10-25
      • 2021-04-17
      相关资源
      最近更新 更多