2010-02-23 7 views
4

Я пытаюсь изменить имя переменной, которая включена внутри цикла for и вызова функции. В приведенном ниже примере я хотел бы передать column_1 функции plot, затем column_2 и т. Д. Я попытался использовать do.call, но он возвращает «object» column_j «not found». Но объект column_j есть, и функция plot работает, если я их жестко закодирую. Помогите оценить.Как включить имя переменной в вызов функции в 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

я тоже не мог воспроизвести проблему оригинального автора. –

2

Вы можете сделать это без команды paste() в вашем for цикле. Просто назначьте столбцы с помощью функции 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(), но это не требуется.

Edit: wrapp синтаксического анализа() в Eval()

+0

Stephen, спасибо, мне было любопытно, что функция синтаксического анализа, поэтому я попробовал ваш пример, но это не сработало для меня. Я также попытался использовать parse (text = column_to_plot) [[1]]), чтобы получить только тот элемент, который я хотел построить, но он говорит, что значения «x» и «y» отличаются. Однако сюжет (x, column_2) работает в этом случае. – John

+0

Ах, извините! См. Править выше ... (заверните вызов parse() в eval()) – hatmatrix

Смежные вопросы