各ステップでオブジェクトが作成される、複数のステップを持つ関数を構築しています。特定のステップが失敗し (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)