我正在开设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。
答案 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中的所有内容都有返回值。 for
和while
循环返回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)
}
这是技术上有效的代码,但从代码为文档的角度来看很奇怪