10.Rで二度ハマったことの備忘録
《状況》
並列処理の結果を格納したら,数値なのにlist形式になってしまう.
《エラーになったコマンド》
parallelsvm<-pforeach(i=1:5,.combine='rbind') ({
model<-ksvm(V387~.,data=acoustic[,c(i,ncol(acoustic))],cross=10)
tot.accuracy<-1-model@cross
return(c(i,tot.accuracy))
}) #/pforeach
max(parallelsvm[,2])
model<-ksvm(V387~.,data=acoustic[,c(i,ncol(acoustic))],cross=10)
tot.accuracy<-1-model@cross
return(c(i,tot.accuracy))
}) #/pforeach
max(parallelsvm[,2])
《エラーメッセージ》
max(parallelsvm[, 2]) でエラー: 引数 'type' (list) が不正です
《原因》
この例では,ksvmでエラーが起きていて,その結果,本来数値が入るべきtot.accuracyにエラーメッセージが混入してしまっていた.そのため,そのエラーメッセージを格納するために本来想定している形式のnumericからlistに変わってしまっていた.
《データの中身を表示してみると…》
parallelsvm[,2]
>result.1 1 0.1760769
>result.2 2 0.1774402
>result.3 3 0.1651925
>result.4 " TRUE/FALSE が必要なところが欠損値です " Expression
>result.5 5 0.1638431
>result.1 1 0.1760769
>result.2 2 0.1774402
>result.3 3 0.1651925
>result.4 " TRUE/FALSE が必要なところが欠損値です " Expression
>result.5 5 0.1638431
《対応》
ksvmがエラー出ないようにしただけです.
《感想》
pforeachの仕様が変わったのかとか,.combineの設定が悪いのかとか,model@crossを使った演算をするとnumericじゃなくなるのかとか,一度listになったらプログラム修正してもその影響がずっと残るのかとか,どうしようもなければlistの中身を参照してmaxを計算するスクリプトを書くべきなのかとか,いろいろいろいろ試行錯誤したのに,まさかの結果でした.
以前も同じことでハマったので,どこかにメモしたつもりだったんだけどなぁ.