2017-06-27 2 views
0

関数 'eval'で作成したオブジェクトに関数 'ggplot'を使用してプロットを割り当てたいとします。このオブジェクトはループ内に配置され、したがってリストとして定義されます。ループの各ラウンドの間、プロットは、変数 'list_pos'を使用してリストの要素として保存する必要があります。eval()を使用した 'subscript out of bounds'エラー - ループ内のassign() - 関数に基づく関数

目的は、3つの異なるグラフ 'Graphs_A'、 'Graphs_B'、 'Graphs_C'を作成して、3つの異なるプロットを保存する要素として作成することです。そのため、結果として私はちょうどR-コードは次のようになります

Graphs_A 

を実行することにより、一度、例えば、グループAのために、特定のサブグループのプロットを呼び出すことができます。私の例では、私は常に同じプロットを要素に割り当てていますが、実際のデータセットではそうではありません。

###### Example ##### 

# Load packages 

install.packages('ggplot2') 
library(ggplot2) 

# Creating data 

names <- c("A","B","C") 

numbers <- c(1,2,3) 

df <- data.frame(
    x = c(1, 2, 3, 4, 5, 6, 7, 8), 
    y = c(3, 2, 4, 4, 6, 8, 9, 8) 
) 

# Loop to assign ggplot to elements of list 

for(j in names){ 
    assign(paste("Graphs_", j, sep=""), list()) 
    list_pos <- 0 

    for(i in numbers){ 
     list_pos <- list_pos + 1 
     assign(
     eval(parse(text=paste("Graphs_", j, sep="")))[[list_pos]], 
     ggplot() + geom_point(data=df, aes(x=x, y=y)) # Plot depends in real data set on value of i 
    ) 
    } 
} 

私はいつも「subscript out of bounds」というエラーを受け取ります。私は

assign(paste("Graphs_", j, sep=""), list("X","Y","Z")) 

としてリストを再定義するような別のものを試してみました。しかし、それは、リストの要素にプロットを割り当てるために助けにはなりませんでした。この問題をどうすれば処理できますか?

+2

'parse'と' assign'は存在しません。あなたはRでより多くの経験があり、悪い(非効率的、理解しにくい、維持しにくい)コードを書くことができるようになるまで、それらのための有効な使用はありません。 – Roland

+0

あなたの答えをありがとう。しかし残念ながら、以前に作成していないオブジェクトに値を割り当てるためには、それらを使用する必要があります。したがって、私が知っているように、私の記事で述べたようにネストされたループを作成する唯一の方法です。 –

+0

する必要はありませんし、そうしないでください。リストを使用してください。 – Roland

答えて

0

最初に、eval(parse(text=paste("Graphs_", j, sep="")))[[list_pos]]という行は意味をなさない:parse(text=paste("Graphs_", j, sep=""))は文字列を生成し、evalは式を評価します。したがって、あなたはあなたがeval(parse(text=...))で作業することができます...

のサブセットすることはできませんが、私はリストを使用することをお勧めします:

# Loop to assign ggplot to elements of list 
Graphs <- list() 
for(j in 1:length(names)){ 
    for(i in numbers){ 
     Graphs[[j]] <- ggplot() + geom_point(data=df, aes(x=x, y=y)) 
    } 
} 

私はあなたがリストにプロットを割り当てる理由を知っているが、上記のコードはありません実行...

+0

ありがとうございました! 私はあなたのソリューションについて既に考えています。しかし私は、私が別のオブジェクト 'Graphs_'にプロットを保存する前にループのラウンドに応じて私のためには機能しません。だから、たとえば 'for(j in names)'の最初のラウンドでは、プロットはループのラウンドに応じて、実際のデータセットでは違っています(for i)。したがって、私は 'for(i in numbers)'に従って3つの異なるプロットを持つ3つの要素を含む3つのリスト 'Graph_A'、 'Graph_B'および 'Graph_C'を取得したいと考えています。だから私は一度に異なるグループのプロットをそれぞれ呼び出すことができます。 –

関連する問題