这是我在论坛中关于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列表?
谢谢,
亚历
答案 0 :(得分:5)
如果你这么做,我建议你使用类似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)
答案 1 :(得分: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 )
答案 2 :(得分:1)
这是最简单的方法:
> 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)