2010-02-23 49 views
4

我正在嘗試更改for循環和函數調用中包含的變量的名稱。在下面的例子中,我想將column_1傳遞給plot函數,然後是column_2等。我嘗試過使用do.call,但它返回「object'column_j'not found」。但對象column_j在那裏,如果我硬編碼它們,劇情功能的作品。幫助非常感謝。如何在R函數調用中包含變量名?

for (j in 2:12) { 
    column_to_plot = paste("column_", j, sep = "") 
    do.call("plot", list(x, as.name(column_to_plot))) 
} 

回答

6

我做的:

x <- runif(100) 
column_2 <- 
    column_3 <- 
    column_4 <- 
    column_5 <- 
    column_6 <- 
    column_7 <- 
    column_8 <- 
    column_9 <- 
    column_10 <- 
    column_11 <- 
    column_12 <- rnorm(100) 

for (j in 2:12) { 
    column_to_plot = paste("column_", j, sep = "") 
    do.call("plot", list(x, as.name(column_to_plot))) 
} 

我有沒有錯誤。也許你可以提供硬編碼(根據你的問題),然後找到錯誤的原因會更簡單。

(我知道我可以使用循環和assign產生的載體,但我想提供明顯的例子)

+1

我也無法重現原來的海報的問題。 – 2010-02-23 12:52:35

2

您可以在for循環做沒有paste()命令。只要將您的循環通過功能colnames()列:

column_to_plot <- colnames(dataframeNAME)[j] 

希望幫助作爲第一雜牌。

1

下面是做到這一點的一種方法:

tmp.df <- data.frame(col_1=rnorm(10),col_2=rnorm(10),col_3=rnorm(10)) 
x <- seq(2,20,by=2) 
plot(x, tmp.df$col_1) 
for(j in 2:3){ 
    name.list <- list("x",paste("col_",j,sep="")) 
    with(tmp.df, do.call("lines",lapply(name.list,as.name))) } 

你也可以做colnames(tmp.df)[J]而不糊(..),如果你願意的話。

2

你試圖通過一個字符串來檢索工作區中的一個對象?在這種情況下,解析()可能會有所幫助:

for (j in 2:12) { 
    column_to_plot = paste("column_", j, sep = "") 
    plot(x, eval(parse(text=column_to_plot))) 
} 

在這種情況下,你可以使用do.call(),但它不是必需的。

編輯:在EVAL wrapp解析()()

+0

Stephen,謝謝,我對解析函數很好奇,所以我嘗試了你的例子,但它對我沒有用。我也試着用parse(text = column_to_plot)[[1]]來得到我想要繪製的元素,但是它表示'x'和'y'的長度是不同的。然而,plot(x,column_2)在這種情況下起作用。 – John 2010-02-23 17:21:13

+0

啊,對不起!請參閱上面的編輯...(在eval()中將調用包裝爲parse()) – hatmatrix 2010-02-24 02:18:18

相關問題