R函数不生成答案,但手动执行步骤工作。。。?

R函数不生成答案,但手动执行步骤工作。。。?,r,function,if-statement,for-loop,correlation,R,Function,If Statement,For Loop,Correlation,该函数获取目录中的特定文件,在省略不完整的数据行后访问长度,然后,如果总行数等于或高于阈值,则将cor值放入向量并返回该向量 代码: 返回值为空。但是,如果我单独完成每个部分,我就能够为每个数据计数高于阈值的文件创建一个具有每个相关性的向量 为什么函数不工作,而是手动执行步骤工作?没有返回语句。您可以通过调用return返回。函数,或者默认情况下,函数中的最后一个表达式将是return语句 您还可以使代码更像R: corr <- function(directory, threshold

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

代码:

返回值为空。但是,如果我单独完成每个部分,我就能够为每个数据计数高于阈值的文件创建一个具有每个相关性的向量


为什么函数不工作,而是手动执行步骤工作?

没有返回语句。您可以通过调用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
            }))
}

这应该比创建向量对象并在每次迭代中展开它要快。

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

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

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()
}

返回语句在哪里?在函数的末尾,你应该放一个returnvector,你不认为吗?你不需要显式的返回,但是函数返回最后一个计算过的表达式。如果没有return语句,R函数返回最后一次计算的结果。您需要returnvector,否则,它将返回最后计算的值,该值可能不是vector,因为vector位于if语句中。此外,您应该检查变量名是否覆盖了可能产生意外结果的现有函数,如vector。在使用新变量之前,只需在命令窗口中键入名称,查看是否存在具有该名称的现有函数。将variable vector更改为vec,但检查vec是否是软件包中的函数。我正在尝试您的代码,但没有得到所需的解决方案。我在is.data.framey中出错:找不到对象“column2”。我使用将column1和column2编辑为实际的列名。我把fname一个人留下了。为了更清楚,我的目录有300多个文件,如果第i个文件的行数不带NA大于等于阈值,则该文件的相关性将放在向量中。是否在列名周围添加引号?去掉列名周围的引号,它应该可以工作。代码可以工作,但是有太多的噪声,返回向量应该像-0.01896-0.14051-0.04390-0.06816-0.12351-0.07589,例如。另外,当阈值低于最短文件时,代码不工作。噪声太大?什么意思?它返回一个包含文件名的属性namesx的向量。。。对我来说似乎是非常有用的信息。如果你不喜欢,你可以做res=corrdir;namesres我错过了在MVP中重命名向量,如果它仍然不起作用。您的文件是什么样子的?我编辑了这个示例以包含生成示例数据,用于检查结果。还纠正了一些小错误。
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)