Как я могу включить имя переменной в вызов функции в R? - PullRequest
5 голосов
/ 23 февраля 2010

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

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

Ответы [ 4 ]

6 голосов
/ 23 февраля 2010

Я делаю:

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, но я хочу привести ясный пример)

2 голосов
/ 23 февраля 2010

Вы пытаетесь получить объект в рабочей области по символьной строке? В этом случае parse () может помочь:

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

В этом случае вы можете использовать do.call (), но это не требуется.

Редактировать: wrapp parse () в eval ()

2 голосов
/ 23 февраля 2010

Вы можете сделать это без команды paste() в вашем цикле for. Просто назначьте столбцы с помощью функции colnames() в вашем цикле:

column_to_plot <- colnames(dataframeNAME)[j]

Надеюсь, это поможет в качестве первого клуджа.

1 голос
/ 23 февраля 2010

Вот один из способов сделать это:

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] вместо paste (..), если хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...