1

ループでオブジェクトを割り当てたいと思っています。私はこれeval(parse(を実行するために何らかの形式が必要であることを読みましたが、エラーリストに遭遇しています。invalid textまたはno such file or directory.以下は私がやろうとしていることの一般的なサンプルコードです。

x <- array(seq(1,18,by=1),dim=c(3,2,3))
for (i in 1:length(x[1,1,])) {
  eval(parse(paste(letters[i],"<-mean(x[,,",i,"])",sep="")
}

そして、これらのオブジェクトの使用が終了したら、それらを削除したいと思います(実際のオブジェクトは非常に大きく、後でメモリの問題が発生します...)

for (i in 1:length(x[1,1,])) eval(parse(paste("rm(",letters[i],")",sep="")))

このスクリプトの両方eval(parse(paste(の部分は、invalid textまたはのエラーを返しno such file or directoryます。使用中に何かが足りませeval(parse(んか?ループ内でオブジェクトを割り当てるためのより簡単でより良い方法はありますか?

4

4 に答える 4

11

それはかなり嫌でイライラする方法です。オブジェクトを削除するためにとのリスト引数assignを割り当てるために使用します。rm

> for (i in 1:length(x[1,1,])) {
+   assign(letters[i],mean(x[,,i]))
+ }
> ls()
[1] "a" "b" "c" "i" "x"
> a
[1] 3.5
> b
[1] 9.5
> c
[1] 15.5
> for (i in 1:length(x[1,1,])) {
+   rm(list=letters[i])
+ }
> ls()
[1] "i" "x"
> 

使用する必要があると感じるときはいつでもparse、fortune(106)を覚えておいてください。

答えがparse()の場合、通常は質問を再考する必要があります。
--Thomas Lumley、R-help(2005年2月)

于 2010-09-14T16:48:22.807 に答える
8

これを処理するためのより良い方法があるように見えますが、本当に「eval(parse(paste(」」アプローチを使用たい場合は、欠落しているのはテキストフラグです。

parseは、最初の引数がファイルへのパスであると想定し、ファイルを解析します。あなたの場合、ファイルを読み取って解析するのではなく、テキストを直接渡して解析する必要があります。したがって、(上記の嫌な形で)書き直されたコードは次のようになります。

letters=c('a','b','c')
x <- array(seq(1,18,by=1),dim=c(3,2,3))
for (i in 1:length(x[1,1,])) {
  eval(parse(text=paste(letters[i],"<-mean(x[,,",i,"])",sep="")))
}

「text=」を指定しないことに加えて、解析および評価ステートメントを閉じるための右側の括弧がいくつか欠落しています。

問題は解決したようですが、このページにアクセスして本当にeval(parse(paste、paste)を使用したい人のために明確にしたいと思います。

于 2011-10-12T19:54:51.393 に答える
5

非常に悪い考えです。自分が何をしているのかを完全に理解していない限り、Rを使用しevalたりRで使用したりしないでください。 変数は、次を使用して作成できます。parse

name<-"x"
assign(name,3) #Eqiv to x<-3

そしてによって削除されました:

name<-"x"
rm(list=name)

しかし、あなたの場合、それは単純な名前付きベクトルで行うことができます:

apply(x,3,mean)->v;names(v)<-letters[1:length(v)]
v
v["b"]
#Some operations on v
rm(v)
于 2010-09-14T16:47:47.613 に答える
5

この場合、eval(paste(またはassign)の使用を避けるのが最善です。どちらかを実行すると、後で追加の頭痛の種となる多くのグローバル変数が作成されます。

最善のアプローチは、既存のデータ構造を使用してオブジェクトを格納することです。これらのタイプのケースでは、リストが最も一般的です。

次に、[ls] apply関数を使用して、さまざまな要素で処理を実行できます。通常は、グローバル変数をループするよりもはるかに高速です。作成されたすべてのオブジェクトを保存する場合は、保存/ロードするリストが1つだけです。それらを削除するときは、1つのオブジェクトを削除するだけで、すべてがなくなります(ループは発生しません)。リストの要素に名前を付けて、後で名前で参照したり、インデックスで参照したりできます。

于 2010-09-14T17:23:48.307 に答える