Изменить список AES вне функции ggplot

Это мой первый вопрос о R на форуме, поэтому заранее извиняюсь, если я допустил ошибку при формулировке вопроса или указании заголовка.

Дело в том, что для конкретной задачи с ggplot я определяю эстетику вне функции ggplot, а затем предоставляю ее в качестве аргумента.

>mytmpaes<-aes(x=Sample,y=ddCt.lin,ymax=ddCt.lin+ddCt.lin.sd,ymin=ddCt.linddCt.lin.sd,fill=factor(endog))
>my.ggplot(x,mytmpaes)

Но иногда я просто хочу изменить некоторые объекты списка mytmpaes, не определяя их все снова с помощью aes (). Однако я действительно не знаю, что делать с этим специальным списком. Список aes выглядит так:

>mytmpaes
List of 5
$ x    : symbol Sample
$ y    : symbol ddCt.lin
$ ymax : language ddCt.lin + ddCt.lin.sd
$ ymin : language ddCt.lin - ddCt.lin.sd
$ fill : language factor(Rep)

Я придумал, как изменить некоторые из них вот так:

 > mytmpaes$x<-as.symbol('Names')
 > mytmpaes$fill<-call('factor',quote(target))
 > mytmpaes
 List of 5
  $ x   : symbol Names
  $ y   : symbol ddCt.lin
  $ ymax: language ddCt.lin + ddCt.lin.sd
  $ ymin: language ddCt.lin - ddCt.lin.sd
  $ fill: language factor(endog)

Однако мне не удалось найти способ изменить ymax или ymin с помощью аналогичного выражения. Например, я хотел бы изменить ymax на 'ddCt.log2 - ddCt.log2.sd'.

Может кто-нибудь дать мне совет по этому поводу? Кроме того, есть ли более правильный способ изменить список aes?

Спасибо,

Алехандро


person Osdorp    schedule 17.07.2013    source источник


Ответы (3)


Думаю, вы ищете substitute:

возвращает дерево синтаксического анализа для (неоцененного) выражения expr, заменяя любые переменные, связанные в env

И в качестве примера:

df <- data.frame(gp = factor(rep(letters[1:3], each = 10)),
                 y = rnorm(30))
##  Make an aes
tmpaes <- aes(x = gp, y = y , ymin = -2 , ymax = 2 )

##  Plot with it
ggplot(df) +
  geom_point( tmpaes )

##  Modify aes with a new variable
new <- 10
tmpaes$ymax <- substitute( new )   

##  replot
ggplot(df) +
  geom_point( tmpaes )

введите описание изображения здесь

person Simon O'Hanlon    schedule 17.07.2013
comment
Спасибо за быстрый ответ. На самом деле он отлично работал как для «символов», так и для «языковых» объектов. - person Osdorp; 17.07.2013

Если вы делаете это часто, я предлагаю вам использовать функцию, похожую на aes:

aes.update <- function (aes, ...) 
{
  aes_new <- structure(as.list(match.call()[-c(1,2)]), class="uneval")
  aes_new <- ggplot2:::rename_aes(aes_new)
  aes[names(aes_new)] <- aes_new
}

Тогда вы можете просто обновить все сразу

mytmpaes_new <- aes.update(mytmpaes, x=Names, ymax=ddCt.log2 - ddCt.log2.sd)
person shadow    schedule 17.07.2013
comment
Я не пробовал, потому что мне не нужно так часто изменять aes, но спасибо также за это более продуманное решение. - person Osdorp; 17.07.2013

Вот самый простой способ:

> a <- aes(x=Sample,y=ddCt.lin,ymax=ddCt.lin+ddCt.lin.sd,ymin=ddCt.linddCt.lin.sd,fill=factor(endog))
> a
List of 5
 $ x   : symbol Sample
 $ y   : symbol ddCt.lin
 $ ymax: language ddCt.lin + ddCt.lin.sd
 $ ymin: symbol ddCt.linddCt.lin.sd
 $ fill: language factor(endog)
> a$ymax <- aes(ddCt.log2 - ddCt.log2.sd)[[1]]
> a
List of 5
 $ x   : symbol Sample
 $ y   : symbol ddCt.lin
 $ ymax: language ddCt.log2 - ddCt.log2.sd
 $ ymin: symbol ddCt.linddCt.lin.sd
 $ fill: language factor(endog)
person kohske    schedule 17.07.2013
comment
Иисус! Не знаю, почему раньше не думал об этом решении. Спасибо также - person Osdorp; 17.07.2013