R功能没有产生答案,但手动操作步骤......?

时间:2014-10-12 05:08:24

标签: r function if-statement for-loop correlation

该函数获取目录中的特定文件,在省略不完整的数据行后访问长度,然后,如果总行数等于或高于阈值,则将cor()值放入向量并返回该向量。

代码:

  corr <- function(directory, threshold = 0){

    files_list <- list.files(directory, full.names=TRUE)
    vector <- c()

    for (i in 1:number of files in directory) {
        file <- read.csv(files_list[i])
        file_noNA <- na.omit(file)

    if(nrow(file_noNA) >= threshold){
        x <- file_noNA$column1
        y <- file_noNA$column2
        a <- cor(x,y)
        vector <- append(vector,a)
        }
      } 
    }

回报为NULL。但是,如果我单独执行每个部分,我可以为每个数据计数高于阈值的文件创建一个包含每个相关性的向量。

为什么功能不起作用,但手动完成这些步骤的工作?

2 个答案:

答案 0 :(得分:0)

没有退货声明。您可以通过调用return(.)函数返回,或者默认情况下函数中的最后一个表达式将是return语句。

您还可以使代码更像R:

corr <- function(directory, threshold = 0){
    files_list <- list.files(directory, full.names=TRUE)

    na.omit(sapply(files_list, function(fname)
            {
                file <- read.csv(fname)
                file_noNA <- na.omit(file)
                if (nrow(file_noNA) >= threshold)
                {
                    return(with(file_noNA, cor(column1, column2)))
                }
                NA
            }))
}

这应该比创建矢量对象更快,并且每次迭代都要扩展它。

答案 1 :(得分:0)

如果没有显式的return语句,R函数将返回上次计算的结果。此函数需要显式返回。我会尝试以下方法,但请注意函数名称已从corr更改为mycorr。

生成一些示例数据文件,以及用于检查函数的结果

nFiles = 10
NCols=2
for (ii in seq(1,nFiles)) {
  NRows = sample(5:30,1)
  fname = paste("data\\test_",ii,".txt",collapse="")
  myMat <- matrix(runif(NCols*NRows), ncol=NCols) 
  write.table(myMat, file=fname, row.names=FALSE, col.names=c("column1","column2"), sep="\t")
  print(paste("File ",fname,"has",NRows,"rows with cor of"))
  print(cor(myMat))
  flush.console()
}

这是函数

myCorr <- function(myDir, threshold = 0){

  files_list <- list.files(myDir, full.names=TRUE)
  mv <- c()

  for (i in seq(1:length(files_list))) {
    file <- read.csv(files_list[i],sep="")
    file_noNA <- na.omit(file)

    if(nrow(file_noNA) >= threshold){
      x <- file_noNA$column1
      y <- file_noNA$column2
      a <- cor(x,y)
      mv<- c(mv,a)
    }
  }
  return(mv)
}

运行该功能,将输出与之前的输出进行比较。可以调整行阈值进行检查。

myDir = "data"
myCorr(myDir)