Я пытаюсь изменить имя переменной, которая включена в для цикла и вызова функции. В примере ниже, я хотел бы, чтобы column_1 был передан функции построения графика, затем column_2 и т.д. Я попытался использовать do.call, но он возвращает "объект 'column_j' не найденный". Но объект column_j там, и работы функции построения графика если я твердый код их в. Помогите многому ценившему.
for (j in 2:12) {
column_to_plot = paste("column_", j, sep = "")
do.call("plot", list(x, as.name(column_to_plot)))
}
Я делаю:
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
, но я хочу привести наглядный пример)
Вы пытаетесь получить объект в рабочей области с помощью строки символов? В этом случае может помочь parse ():
for (j in 2:12) {
column_to_plot = paste("column_", j, sep = "")
plot(x, eval(parse(text=column_to_plot)))
}
В этом случае вы можете использовать do.call (), но это не обязательно.
Изменить: обернуть parse () в eval ()
Вот один из способов сделать это:
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(...), если хотите.
Вы можете сделать это без команды paste ()
в вашем цикле for
. Просто назначьте столбцы с помощью функции colnames ()
в вашем цикле:
column_to_plot <- colnames(dataframeNAME)[j]
Надеюсь, что это поможет в качестве первого кладжа.