首先,我是R初学者,目前参加R编程课程。在教授R的基础知识时非常缺乏,所以我试图通过Stack Overflow上的精彩贡献者来学习自己。我试图弄清楚嵌套函数是如何工作的,这意味着我还需要了解词法作用域的工作原理。我有一个函数可以计算多个CSV文件中的完整案例并立即吐出一个漂亮的表格。
这是我的代码,我意识到如果我使用apply
的东西会更清洁,但它的工作原理是:
complete<- function(directory, id = 1:332){
data <- NULL
for (i in 1:length(id)) {
data[[i]]<- c(paste(directory, "/", formatC(id[i], width=3, flag=0),
".csv", sep=""))
}
cases <- NULL
for (d in 1:length(data)) {
cases[[d]]<-c(read.csv(data[d]))
}
df <- NULL
for (c in 1:length(cases)){
df[[c]] <- (data.frame(cases[c]))
}
dt <- do.call(rbind, df)
ok <- (complete.cases(dt))
finally <- as.data.frame(table(dt[ok, "ID"]), colnames=c("id", "nobs"))
colnames(finally) <- c('id', 'nobs')
return(finally)
}
我现在试图调用数据框finally
中的不同变量,这是上述函数在此新函数中的输出:
corr<-function(directory, threshold = 0){
complete(directory, id = 1:332)
finally$nobs
}
corr('specdata')
如果没有finally$nobs
,此函数会按原样吐出数据框,但是当我尝试调用对象nobs
中的变量finally
时,它会显示对象finally
找不到。我意识到这个问题是由于我对词法范围的主题缺乏了解,我的教授还没有真正明确词法范围,所以我不完全确定如何在嵌套函数环境中找到对象...任何帮助会很棒。
答案 0 :(得分:3)
对象finally
仅在函数complete()
中的范围内。如果要对要返回的对象执行更多操作,则需要将其存储在您正在使用的环境中的变量中(在此实例中,您正在使用的环境是函数corr()
。我们没有在任何功能内工作,环境将是全球环境&#34;)。换句话说,这段代码应该有效:
corr<-function(directory, threshold=0){
this.finally <- complete(directory, id=1:332)
this.finally$nobs
}
我正在调用complete()
this.finally
返回的对象,以帮助将其与现在超出范围的对象finally
区分开来。当然,您可以随意调用它!