1

まず、私は現在 R プログラミング コースを受講している R 初心者です。R の基礎を教えることは非常に不足しているので、スタック オーバーフローのすばらしい貢献者を通じて自分自身を学ぼうとしています。ネストされた関数がどのように機能するかを理解しようとしています。つまり、レキシカル スコープがどのように機能するかについても学ぶ必要があります。複数の 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')

この関数がないと、データフレームが吐き出されますが、 objectでfinally$nobs変数を呼び出そうとすると、オブジェクトが見つからないと表示されます。この問題は、レキシカル スコープに関する私の理解不足によるものだと認識しています。教授はレキシカル スコープをあまり明確にしていないため、ネストされた関数環境内でオブジェクトを見つける方法が完全にはわかりません...助けは素晴らしいでしょう。nobsfinallyfinally

4

1 に答える 1

3

オブジェクトfinallyは、関数内のスコープ内にのみありますcomplete()。返されるオブジェクトでさらに何かをしたい場合は、作業している環境の変数にそれを格納する必要があります (この場合、作業している環境は functioncorr()です。作業していなかった場合関数内では、環境は「グローバル環境」になります)。つまり、このコードは機能するはずです。

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 に答える