如果没有data.frame(),为什么我的for循环不起作用?

时间:2017-11-18 03:17:04

标签: r for-loop dataframe

我正在开设Coursera数据科学课程。我一直在评估我的代码到正确的答案,并且出于某种原因,即使我的最终答案是正确的,但是由于某种原因,从第二步到最后一步并没有产生我期望的输出。

这是我的最终代码。它是一个函数,它读取一个充满csv文件的目录,并计算每个文件中的完整值,并打印出相关的id号。

complete<-function(dir, id=1:332){
    comp_cases<-numeric()
    files<-list.files(dir, full.names=TRUE){
        for (i in id){
            data<-read.csv(filelist[i])
            vals<-sum(complete.cases(data)
            comp_cases<-c(comp_cases,v)
           }


  data.frame(id, comp_cases)
}

但是,当我省略data.frame(id,comp_cases)并且只调用comp_cases时,我得到第一个文件中的完整个案数,而不是所有文件中完成次数的向量。为什么我的循环没有data.frame(id,comp_cases),它不在循环本身之外? data.frames()到底在做什么?我在Windows上使用R 3.42。

1 个答案:

答案 0 :(得分:1)

在R中调用函数时返回的值是语句的值。当然,您可以使用return(something)显式返回值,但是当您不需要显式地返回函数时,许多R程序员将省略对return()的调用并简单地结束函数使用函数调用(在这种情况下data.frame(...)返回一个值,或者如果值已经返回,程序员可能只是评估要返回的值,如下所示:

my_fun <- function(x){
    out <- NULL # initialize the return value.

    ... do things ... 

    out # implicitly return this value
}

另外,R中的所有内容都有返回值。 forwhile循环返回NULL,分配(例如x = 3)会返回指定的值。 R程序员可能会用最后一点做一些奇怪的事情,例如:

complete<-function(dir, id=2:332){
    comp_cases<-numeric()
    files<-list.files(dir, full.names=TRUE){
        for (i in id){
            data<-read.csv(filelist[i])
            vals<-sum(complete.cases(data)
            comp_cases<-c(comp_cases,v)
           }


  answer <- data.frame(id, comp_cases)
}

这是技术上有效的代码,但从代码为文档的角度来看很奇怪