在R中的循环代码块内创建全局变量

时间:2017-05-21 12:37:23

标签: arrays r loops

我是R的新手,我正在尝试访问循环外的数据

# List of 100 stock data
a <-c ("one", "two", "three", "four",...)
i = 1
while (i <= length(a)) {
  # make a list_element.csv to be accessed from local storage
  formated_path <-paste(a[i], ".csv")
    if (!file.exists(formated_path)) {
      output <- paste("Data for ", a[i], "Not found!")
      print(output)
    } else {
      print("found")     
      a[i] <- read.csv(formated_path, header = TRUE)

      # I have tried to change the name of the array to
      # correspond  to the element name but no luck as
      paste(a[i], "_stock") <-read.csv(formated_path, header = TRUE)
      return(a[i])
      i = i + 1
    }
  }

我希望的结果是能够将单独加载的.csv与循环外的其他函数一起使用。我不想要一个多维数组,只需要对应于数组元素的单个数组:

# Desired output
print(one)  # Should be the elements of a

1 个答案:

答案 0 :(得分:0)

如果您真的想要追求自己的方法,那么您正在寻找的功能称为assign。不过,我想鼓励您以不同的方式思考您的问题:

a <- c("one", "two", "three", "four")
fileNames <- paste0(a, ".csv")
csvList <- lapply(fileNames, read.csv)
str(csvList)

您可以利用Rs的能力处理向量(paste)和函数式编程(lapply),而不是问题中的命令式方法。

如果您需要进一步处理丢失的文件,可以定义一个包含该逻辑的新read.csv函数:

myReadCsv <- function(fileName) {
  if (file.exists(fileName){
    read.csv(fileName)
  } else {
    message("File does not exist and is ignored")
    NULL
  }
}

lapply的调用中使用它。您可以在Advanced R中找到详细说明。