No.07681 Rに関するエラー  【ちば】 2008/09/20(Sat) 11:07

現在,Rを使っているのですが,慣れないせいもあって,困っています。
ファイルを読み込んで,作業をして,ファイルに書き出すというオブジェクトを作っています。
そのオブジェクトを実行すると,エラーが起きます。
エラーメッセージは以下のとおりです。

「以下にエラー file(file, "r") : コネクションを開くことができません
追加情報: Warning message:
In file(file, "r") :
ファイル 'C:フォルダ名ファイル名' を開くことができません: No such file or directory 」
(実際のフォルダ名は使わず,上ではファイル名,フォルダ名としています)

過去ログの検索を行い,そこから学んで作業ディレクトリを上のフォルダ名に変えました。それでもエラーメッセージがでます。

ちなみにオブジェクトの先頭文は
t1<-read.table("C:\フォルダ名\ファイル名.csv",sep=",",header=TRUE)
です。

使用OSはWindows vistaでRのバージョンは2.7.2です。
また,Windows XPでも使用しています。(Rのバージョンはちょっと今分かりません)

どなたか,エラーを解決する方法をご存知の方,教えてください。
宜しくお願いします。

No.07695 Re: Rに関するエラー  【青木繁伸】 2008/09/22(Mon) 13:50

ファイルパスに日本語が含まれていませんか?

> 実際のフォルダ名は使わず,上ではファイル名,フォルダ名としています

の場合には,実際にわざわざ「ファイル名」,「フォルダ名」という日本語を含んだパス名を指定したと言うことですか??

外つ国のソフトを使う際には,そのソフトが日本語に対応していると言っても程度問題なので,あんまり日本語に依存しない方がよいと思います。「ファイルパスに日本語を含めないでください」とわざわざ断っているソフトも多い(多かった)です

No.07705 Re: Rに関するエラー  【ちば】 2008/09/22(Mon) 16:21

ご回答ありがとうございます

> 実際のフォルダ名は使わず,上ではファイル名,フォルダ名としています
これは,この掲示板に投稿するときに,実際のファイル名を書くと,情報が漏れると怖いので,この掲示板では「フォルダ名」,「ファイル名」としているということです。
なので,実際は日本語のファイル名ではありません。

試行錯誤しているうちに,どうにかオブジェクトが動いてくれるようになりました。
お騒がせいたしました。
ただ,私でない人が作ったオブジェクトは,動いてくれるのですが,私が作ったオブジェクトは,実行すると,論理値添え字が長すぎます,というエラーが出ます。
オブジェクトを見直しても,特に長い単語は見当たらないように思うのですが,とりあえず,他の人が作ったオブジェクトを使っていこうと思います。

また困ったときには,質問を投稿するかもしれませんが,よろしくお願いいたします。

No.07706 Re: Rに関するエラー  【青木繁伸】 2008/09/22(Mon) 16:35

> ちなみにオブジェクトの先頭文は
> t1<-read.table("C:\フォルダ名\ファイル名.csv",sep=",",header=TRUE)

バックスラッシュを使っているのですか?
バックスラッシュなら二重にしないといけないのでは?
スラッシュを使えばよいと思うのですけど。

> 私が作ったオブジェクトは,実行すると,論理値添え字が長すぎます,というエラーが出ます

それは,また別の原因でしょう?

No.07711 Re: Rに関するエラー  【ちば】 2008/09/22(Mon) 20:25

ご回答ありがとうございます。
おっしゃる通りバックスラッシュを二重にすると動きました。

また,論理添え字の件も,別の原因ですね。
一緒にしてしまいすみませんでした。

もし,論理添え字の件もお分かりになる方がいらっしゃったら,よろしくお願い致します。

No.07712 Re: Rに関するエラー  【青木繁伸】 2008/09/22(Mon) 22:17

> 実行すると,論理値添え字が長すぎます,というエラーが出ます

というだけでは分かりませんよ。動かないというプログラムを示してください。全部である必要はなく,逆に長すぎても意味ないので,エラーを再現できる最短のプログラムを示してください。

No.07713 Re: Rに関するエラー  【ちば】 2008/09/23(Tue) 10:29

アドバイスありがとうございます。
一応,以下がプログラム文です。function(){}は省略してあります。
長くなってしまいますがすみません。
(重回帰の予測変数の係数を取り出すプログラムです)
#データを読み込む
t1<-read.table("C:\\フォルダ名\\ファイル名.csv",sep=",",header=TRUE)
#データの予測変数の部分を取り出す。
xx1<-matrix(as.matrix(t1[,3:8]),ncol=6)
#データの目的変数の部分を取り出す
yy<-as.matrix(t1[,2])
#ndはデータ数
nd<-length(as.vector(yy))
#npは予測変数の数
np<-6
#予測変数の全ての組み合わせを求める。
ns<-2^np-1
aint<-ns
cd<-rep(0,length=np)
cdm<-NULL
for(aint in 1:ns){
for(kk in 1:100000){
amod<-aint%%2
aint<-aint%%2
cd[kk]<-amod
if(aint==0) break
}
cd<-cd==1
cdm<-cbind(cdm,cd)
}
##print("cdm= ")
##print(cdm)
#予測変数の組み合わせの中からGCVを最小にするものを選ぶ。
gcvt<-NULL
for(ii in 1:ns){
cd<-cdm[,ii]
#「drop=F」により,行または列の数が1であってもxxsが行列の形式になる。
xxs<-xx1[,cd,drop=F]
data1<-data.frame(x=xxs,y=yy)
lm.out<-lm(y~.,data=data1)
lev1<-lm.influence(lm.out)$hat
ey<-fitted(lm.out)
fr<-sum(lev1)
#以下がGCVの値。この値が小さい重回帰式が好ましい。
gcvt[ii]<-sum((yy-ey)^2)/(nd*(1-fr/nd)^2)
}
##print("gcvt=")
##print(gcvt)
#cdmの中で,gcvtの値が最小になるものを選ぶ。
bestcd<-cdm[,gcvt==min(gcvt)]
#予測変数の一番好ましい組み合わせがbestcdである。
print("bestcd=")
print(bestcd)
#データから最も好ましい予測変数の部分を取り出す。
xxt<-xx1[,bestcd]
data2<-data.frame(x=xxt,y=yy)
lm.out<-lm(y~.,data=data2)
ey<-lm.out$fitted
print("重回帰式の回帰係数")
print(lm.out$coefficients)
#グラフを描く。
par(mfrow=c(1,1),mai=c(0.8,0.8,0.5,0.5),oma=c(8,1,8,1))
xmin<-min(yy)-abs(min(yy))*0.1
xmax<-max(yy)+abs(max(yy))*0.1
ymin<-min(ey)-abs(min(ey))*0.1
ymax<-max(ey)+abs(max(ey))*0.1
plot(yy,ey,type="n",xlim=c(xmin,xmax),ylim=c(xmin,xmax),xlab="実測値",ylab="推定値")
points(yy,ey,pch=3,col=4,cex=1)
#結果をファイルにして出力する。
multi1<-cbind(yy,ey)
write.csv(multi1,file="C:\\フォルダ名\\ファイル名",row.names=F)
これを実行すると
エラー: (subscript) 論理値添え字が長すぎます
と出ます。

No.07714 Re: Rに関するエラー  【青木繁伸】 2008/09/23(Tue) 20:58

「エラーを再現できるように」ということは,他の人がこのプログラムを実行したときに,以下のようなエラーは出ないように準備するということです。
> t1<-read.table("C:\\フォルダ名\\ファイル名.csv",sep=",",header=TRUE)
以下にエラー file(file, "r") : コネクションを開くことができません
追加情報: Warning message:
In file(file, "r") :
ファイル 'C:\フォルダ名\ファイル名.csv' を開くことができません: No such file or directory
> #データの予測変数の部分を取り出す。
> xx1<-matrix(as.matrix(t1[,3:8]),ncol=6)
以下にエラー as.matrix(t1[, 3:8]) : オブジェクト "t1" は存在しません
> #データの目的変数の部分を取り出す
> yy<-as.matrix(t1[,2])
以下にエラー as.matrix(t1[, 2]) : オブジェクト "t1" は存在しません
> #ndはデータ数
> nd<-length(as.vector(yy))
以下にエラー as.vector(yy) : オブジェクト "yy" は存在しません

中略

エラー: オブジェクト "xx1" は存在しません
+ ##print("gcvt=")
> ##print(gcvt)
> #cdmの中で,gcvtの値が最小になるものを選ぶ。
> bestcd<-cdm[,gcvt==min(gcvt)]
Warning message:
In min(gcvt) : min の引数に有限な値がありません:Inf を返します

中略

> xxt<-xx1[,bestcd]
エラー: オブジェクト "xx1" は存在しません
> data2<-data.frame(x=xxt,y=yy)
以下にエラー data.frame(x = xxt, y = yy) :
オブジェクト "xxt" は存在しません
> lm.out<-lm(y~.,data=data2)
以下にエラー inherits(x, "data.frame") :
オブジェクト "data2" は存在しません
> ey<-lm.out$fitted
エラー: オブジェクト "lm.out" は存在しません
> print("重回帰式の回帰係数")
[1] "重回帰式の回帰係数"
> print(lm.out$coefficients)
以下にエラー print(lm.out$coefficients) :
オブジェクト "lm.out" は存在しません
> #グラフを描く。
> par(mfrow=c(1,1),mai=c(0.8,0.8,0.5,0.5),oma=c(8,1,8,1))
> xmin<-min(yy)-abs(min(yy))*0.1
エラー: オブジェクト "yy" は存在しません
> xmax<-max(yy)+abs(max(yy))*0.1
エラー: オブジェクト "yy" は存在しません
> ymin<-min(ey)-abs(min(ey))*0.1
エラー: オブジェクト "ey" は存在しません
> ymax<-max(ey)+abs(max(ey))*0.1
エラー: オブジェクト "ey" は存在しません
> plot(yy,ey,type="n",xlim=c(xmin,xmax),ylim=c(xmin,xmax),xlab="実測値",ylab="推定値")
以下にエラー plot(yy, ey, type = "n", xlim = c(xmin, xmax), ylim = c(xmin, :
オブジェクト "yy" は存在しません
> points(yy,ey,pch=3,col=4,cex=1)
以下にエラー points(yy, ey, pch = 3, col = 4, cex = 1) :
オブジェクト "yy" は存在しません
> #結果をファイルにして出力する。
> multi1<-cbind(yy,ey)
以下にエラー cbind(yy, ey) : オブジェクト "yy" は存在しません
> write.csv(multi1,file="C:\\フォルダ名\\ファイル名",row.names=F)
以下にエラー inherits(x, "data.frame") :
オブジェクト "multi1" は存在しません
たぶん,[ファイル名.csv]がこんなものですよと言う例となるファイルが与えられればよいのでしょう。

No.07715 Re: Rに関するエラー  【青木繁伸】 2008/09/23(Tue) 21:25

特定のプログラムを動くようにするというようなアドバイスではなく,一般的なプログラム作成に冠するアドバイス

プログラムのテストデータは,一般に公開されているデータを使うとよい。あなたのプログラムは,なにか,条件を満たすような独立変数のセットを求めるプログラムなのかな?
だっ たら,irisデータセットを使うとよいのでは,1〜3列のデータで4列のデータを予測する。例えば,あなたのプログラムの前半は以下のようになるだろ う。また,ついでに,何かをするプログラムは,関数として定義し,データを引数で与え,その関数内で必要になる数値は全て引数,および,引数から計算に よって得られるものとする。例えば以下のようになる
#データを読み込む
t1<-iris[1:4]    ## irisデータセットの1〜4列(数値データフレーム)
#データの予測変数の部分を取り出す。
xx1<-as.matrix(t1[,1:3]) ## 今回はたぶんこでよいはず!!
#データの目的変数の部分を取り出す
yy<-as.matrix(t1[,4])
#ndはデータ数
nd<-length(as.vector(yy))
#npは予測変数の数
np<-ncol(xx1) ## あまり特定の条件下の数値を設定するのはよくない
#予測変数の全ての組み合わせを求める。
で, あとは,なにか複雑な計算をしているようで,時間が掛かっているようですね。プログラムを読む気もなかったし,どれくらい時間が掛かるか分からないので途 中で中断しました。(あなたの環境で,どれくらいの時間が掛かるのでしょうかね?)そもそも,どういうデータを与えて,どういうことをやって,どういう結 果を期待している位の説明はあってしかるべきかと。(まあ,第三者は問題解決をしなくてはならないという必然性はないので)。

No.07716 Re: Rに関するエラー  【青木繁伸】 2008/09/23(Tue) 21:41

ちなみに,時間が掛かりすぎるのは
for(kk in 1:100000){
の部分だろうと推察し,
for(kk in 1:10000){
のように探索回数(?)を小さくすると,何のエラーも出さず,終了しました。もっとも,その結果があなたの意図したものかどうかは分かりませんが。
ファイルへの出力は以下のようなものでした。。。
"","ey"
0.2,1.19933333333333
0.2,1.19933333333333
  中略
2.3,1.19933333333333
1.8,1.19933333333333
グラフィック出力は今回の例では不完全なもののようでしたね。

このことから考えると,エラーが出たのは,「あなたが用意したデータファイルに問題がある」ということでは?

デ バッグは論理的に逐次的に進めないといけません。答えの分かっているデータを与えて,解析(プログラム)の途中で,ちゃんと期待通りの処理が行われている (期待通りの答えになっている)ことを順次調べていくのです。おかしな答えになったら,その前に行った処理が間違えているので,その部分をよく吟味して, 正しい答えになるように修正する必要があるのです。

どこに原因があるかを突き止めずに,ああでもあろうか,こうでもあろうかと,闇雲にプログラムをいじっても(弄らずに悩んでいたのならなおさら),正しい答えが得られる可能性は非常に低いと言うことは明らかでしょう。

No.07717 Re: Rに関するエラー  【青木繁伸】 2008/09/23(Tue) 22:42

プログラムが何をやっているかに無関係に,デバッグは出来るという例として,以下のようなことを。問題の出る部分を特定するためにそれぞれの文の前に確認のための cat を挿入して容疑部分を確認してみると,
xxs<-xx1[,cd,drop=F]
が怪しいと思うに至った。
cat("############ ncol(cdm)", ncol(cdm), "\n")
cd<-cdm[,ii]
cat("##2\n")
#「drop=F」により,行または列の数が1であってもxxsが行列の形式になる。
cat("cd=", cd,"\n")
xxs<-xx1[,cd,drop=F]
としてみると,
############ ncol(cdm) 7 
##2
cd= TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
エラー: (subscript) 論理値添え字が長すぎます
ということになったので,どうも,この部分が怪しい(間違い)ということが分かるのだが,どうやったらあなたの望むように出来るかまでは,追求する気がない。(^_^;)

エラーを再現できるような最小限のプログラムを,こちらから呈示すると,以下のようになっているのですよ(というか,このエラーは,こういうときに出るんですよ)と言うこと。
> a <- matrix(1:25, 5, 5)
> b <- sample(c(FALSE, TRUE), 100, replace=TRUE)
> a[,b]
エラー: (subscript) 論理値添え字が長すぎます
これは,あなたのプログラムのエラーの発生状況を,再現していると思うのですけどね。。。

No.07718 Re: Rに関するエラー  【青木繁伸】 2008/09/23(Tue) 23:09

############ ncol(cdm) 7
############ nrow(cdm) 100
############ length(cd) 100
ということのようなので,
xxs<-xx1[,cd,drop=F]
ではなくて,
xxs<-xx1[cd,,drop=F]
ではないのかなあとか。。。

No.07725 Re: Rに関するエラー  【ちば】 2008/09/24(Wed) 13:40

色々と考えてくださり,本当にどうもありがとうございました。
catなど知らないこともあったので,勉強になりました。

プログラムの方は,アドバイスも参考にし,色々いじったものの,やはりエラーがでるので,やはり,他の人が作ったものを使っていこうと思います。
(Excel2003でCSVファイルを作ると,他の人のでうまくいきました)

色々と考えていただいたのにすみませんでした。
本当にどうもありがとうございました。

● 「統計学関連なんでもあり」の過去ログ--- 042 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る