在嵌套函数R中调用对象

时间:2014-05-20 17:25:37

标签: r object nested-function lexical-scope

首先,我是R初学者,目前参加R编程课程。在教授R的基础知识时非常缺乏,所以我试图通过Stack Overflow上的精彩贡献者来学习自己。我试图弄清楚嵌套函数是如何工作的,这意味着我还需要了解词法作用域的工作原理。我有一个函数可以计算多个CSV文件中的完整案例并立即吐出一个漂亮的表格。

  • 这是CSV文件: https://d396qusza40orc.cloudfront.net/rprog%2Fdata%2Fspecdata.zip
  • 这是我的代码,我意识到如果我使用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找不到。我意识到这个问题是由于我对词法范围的主题缺乏了解,我的教授还没有真正明确词法范围,所以我不完全确定如何在嵌套函数环境中找到对象...任何帮助会很棒。

1 个答案:

答案 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区分开来。当然,您可以随意调用它!