3

Rが「eval(expr、envir、enclos)のエラー:オブジェクト'thresh'が見つかりません」と言っている関数内のデータフレームのリストにサブセットを適用しているときに、有線の問題が発生しました。なぜこれが起こるのだろうか。

test<-list()
test[[1]]<-as.data.frame(matrix(rnorm(50*5,10,100),50,5))
test[[2]]<-as.data.frame(matrix(rnorm(50*5,10,100),50,5))


findmax<-function(test,thresh){
  print(thresh)
  max(unlist(sapply(test,subset,V1>thresh,select=c("V1"))))
}

findmax(test,thresh=10)
4

1 に答える 1

3

警告に注意してください?subset

Warning:

     This is a convenience function intended for use interactively.
     For programming it is better to use the standard subsetting
     functions like ‘[’, and in particular the non-standard evaluation
     of argument ‘subset’ can have unanticipated consequences.

subsetには、呼び出し環境などに応じて、オブジェクトや変数を探す場所に関する奇妙な評価ルールがあります。これらは、ユーザーがトップレベルでインタラクティブに呼び出すと正常に機能しますが、見つけたように関数内にラップすると失敗することがよくあります。

標準のサブセットを使用して関数を書き直す1つの方法は次のとおりです。

findmax <- function(test, thresh, want) {
    foo <- function(x, thresh, want) {
       take <- x[, want] > thresh
       x[take, want]
    }
    max(unlist(sapply(test, foo, thresh = thresh, want = want)))
}
findmax(test, thresh = 10, want = "V1")

あなたのテストデータのためにこれは与える:

R> findmax(test, thresh = 10, want = "V1")
[1] 230.9756
于 2012-09-03T09:03:06.000 に答える