【问题标题】:calling objects in nested function R在嵌套函数 R 中调用对象
【发布时间】:2014-07-09 02:21:57
【问题描述】:

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

【问题讨论】:

  • 请贴出调用函数corr并导致错误的代码。
  • 对不起,有代码抛出错误,我意识到 finally$nobs 是完全不正确的格式,这就是我需要帮助的...

标签: r object nested-function lexical-scope


【解决方案1】:

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

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

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

【讨论】: