3

各ステップでオブジェクトが作成される、複数のステップを持つ関数を構築しています。特定のステップが失敗し (temp3)、前のステップ オブジェクトが見つかりません (エラー: オブジェクト 'temp2' が見つかりません)。理由はわかりません-関数内で、以前に作成されたオブジェクトに続く各ステップで、まったく同じ構造に従う同様の関数があり、正常に実行されます。そのコードを関数の外で実行すると機能し (コードは問題ないように見えます)、debug() を使用すると、データを作成していないと思われるステップ (temp2) が実際にローカル メモリに保存されます (したがって、オブジェクト "temp2") ですが、何らかの理由で R がそれを認識または使用していないようです。私は困惑しています!多分、私' R がどのようにステップを評価し、ローカル メモリ内でオブジェクトをリコールしているかがわからないだけですか? 関数の書き方が間違っていませんか?

この関数は奇妙なパッケージなどをリコールするので、もっと役立つ場合は、実際の例を簡単に準備できますが、現時点では、R がオブジェクトを関数内のローカルメモリに割り当てる方法を誤解していることが問題だと思います。同様のクエリがここにあります。 R は関数呼び出しでオブジェクトをどのように処理しますか? 、しかし実際には、関数内で新しいオブジェクトをそれぞれ割り当てています。助けていただけますか?

    glm.random<-function(df){
  reps=5
  output<-matrix(NA, ncol=1, nrow=0)
    while (length(output[,1])<reps) {    
      temp1 <- ddply(df,.(study_id),randomRows,1)
      temp2 <- subset(temp1,select = c(continent,taxatype, metric,nullm, yi_pos))
      temp3 <- glmulti(yi_pos ~ ., data = temp2, family = gaussian( link = log), crit = aic, plotty = F,  report = F)           
      temp4 <- noquote(paste(summary(temp3)$bestmodel[1]))
      output<-rbind(output,temp4)     
      }
    write.table(output, "output.glm.random1.txt", append=TRUE, sep="\t", quote=FALSE)
  }

返信で:

また会ったね、

アンドリー – 1)。そこで、サブセットの使用を削除します (ただし、ここで興味深いのは、「予期しない結果」とは何ですか?)。2)。手元のデータでは難しいと感じていましたが、あなたの主張は理解でき、ここでのコーディングアプローチを改善する必要があります 3)。良いヒント!しかし、ここでは動作を確認するためだけに行っています。おそらく、その出力オブジェクトをさらに分析するために使用するだけです。

ギャビン 1) やります!2+3) 「temp1」の作成 (または呼び出し) にエラーがあるようです。

私が望むものの下には、再現可能なコードがあります。それが役立つ場合、私が複製しようとしているアプローチはGibson et al。2011 自然 478:378。(詳細な方法「一般化された線形モデル」を参照してください)。

Thank you!

    #rm(list = ls())
    library("plyr")
    library("glmulti")
    # random rows function
    randomRows = function(df,n){
      return(df[sample(nrow(df),n),])
    }
    # Dataframe example
    study_id <- c(1,1,1,1,2,2,3,3,3,4)
    continent <- c("AF","AF","AF","AF","AF","AF", "AS", "AS", "AS", "SA")
    taxatype <- c("bird","bird","bird","mam","mam","arthro", "arthro", "arthro", "arthro", "arthro")
    metric<- c("sppr","sppr","sppr","sppr","abund","abund", "abund", "abund", "abund", "abund")
    extra.data<- c(34:43)
    yi_pos<- runif(1:10)
    df<- data.frame(study_id=study_id, continent=continent,metric=metric, taxatype=taxatype,extra.data = extra.data, yi_pos = yi_pos)
    df

    # Function. Goal:repeat x10000 (but here reps =5) ( Select one random value per study_id, run glmulti{glmulti}, select best ranked model, concatenate to an output and export). 
    glm.random<-function(df){
      reps=5
      output<-matrix(NA, ncol=1, nrow=0)
      while (length(output[,1])<reps) {

        temp1 <- ddply(df,.(study_id),randomRows,1)
        temp3 <- glmulti(yi_pos ~ continent+taxatype+metric, data = temp1, family = gaussian( link = log), crit = aic, plotty = F,  report = F)          
        temp4 <- noquote(paste(summary(temp3)$bestmodel[1]))
        output<-rbind(output,temp4)       
        }
      write.table(output, "output.glm.random1.txt", append=TRUE, sep="\t", quote=FALSE)
    }

    # run function to obtain error
    glm.random(df)

# debug(glm.random)
# glm.random(df)
# undebug(glm.random)
4

1 に答える 1

2

から?glmulti

[引数dataが]指定されていない場合、glmultiは、式の環境、y引数として渡された近似モデル、またはグローバル環境からデータを検索しようとします。

ただし、を指定するdata = temp1と、glmulti明らかにこのオブジェクトのグローバル環境を検索します。したがって、ランダムに選択したデータをグローバル環境に割り当てる必要がある場合があります(名前とオブジェクトをチェックするために、名前を少し変更しました)。

glm.random2<-function(df){
  reps=5
  output<-matrix(NA, ncol=1, nrow=0)
  while (length(output[,1])<reps) {
## Here things are different
    temp2 <- ddply(df,.(study_id),randomRows,1)
    names(temp2)[2]<-"cOntinent"
    assign("temp1",temp2,envir=.GlobalEnv)
## Note the slightly modified formula, to check whether
## gmulti looks for terms in temp1 or simply as named objects in the environment
## It looks like the former, which is good.
    temp3 <- glmulti(yi_pos ~ cOntinent+taxatype+metric, data = temp1, 
      family = gaussian( link = log), crit = aic, plotty = F,  report = F)          
    temp4 <- noquote(paste(summary(temp3)$bestmodel[1]))
    output<-rbind(output,temp4)
## Remove the object temp1 from the global environment
    rm(temp1,envir=.GlobalEnv)
    }
  write.table(output, "output.glm.random1.txt", append=TRUE, sep="\t", quote=FALSE)
}

# run function - no error for me!
glm.random2(df)

これが意図した動作方法であるかどうかをパッケージメンテナに確認することをお勧めしますglmulti

于 2012-04-26T13:39:53.983 に答える