2017-06-27 37 views
0

我想使用函數'ggplot'將函數圖分配給函數'eval'創建的對象。該對象位於一個循環中,因此定義爲一個列表。在循環的每一輪中,應該使用變量'list_pos'將該圖保存爲列表的一個元素。錯誤'下標越界'使用eval() - 基於assign()的函數 - 循環中的函數

目標是創建三個不同的列表'Graphs_A','Graphs_B'和'Graphs_C',每個三個不同的圖作爲元素保存。因此,作爲一個結果,我可以只運行

Graphs_A 

的R-代碼如下所示調用特定亞羣的地塊,例如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 
    ) 
    } 
} 

我總是得到一個錯誤'下標越界'。我嘗試了不同的東西,如重新定義列表

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 name)',我的實際數據集中的圖是不同的,取決於循環的'for(i in numbers)'。因此,我希望根據'for(i in numbers)'得到三個列表'Graph_A','Graph_B'和'Graph_C',三個元素包含三個不同的圖。因此,我可以一次爲不同的小組分配地塊。 –