1

首先,我是一名 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这个函数,它应该会吐出数据框,但是当我尝试调用nobsobject 中的变量时finally,它说finally找不到 object。我意识到这个问题是由于我对词汇范围的主题缺乏了解,我的教授并没有真正明确词汇范围,所以我不完全确定如何在嵌套函数环境中找到对象......任何帮助会很大。

4

1 回答 1

3

该对象finally仅在函数范围内complete()。如果你想对返回的对象做进一步的事情,你需要将它存储在你正在工作的环境中的一个变量中(在这种情况下,你正在工作的环境是 function corr()。如果我们没有工作在任何函数内部,环境都是“全局环境”)。换句话说,这段代码应该可以工作:

corr<-function(directory, threshold=0){
    this.finally <- complete(directory, id=1:332)
    this.finally$nobs
}

我正在调用返回的对象,complete() this.finally以帮助将其与finally现在超出范围的对象区分开来。当然,你可以叫它任何你喜欢的名字!

于 2014-05-20T18:18:55.093 回答