我正在尝试定义此函数以轻松地将自定义主题设置为ggplot,但我无法动态使用element_blank()
等函数。例如,指定是否具有垂直网格线作为TRUE / FALSE参数:
qplot(data=df, x=quarter, y=value, geom="line") +
style(grid.vertical = F)
style = function (grid.vertical = T) {
(theme_foundation() +
theme(
panel.grid.major.x = ifelse(grid.vertical == T, element_line(), element_blank())
))}
产生..
Error in (function (el, elname) :
Element panel.grid.major.x must be a element_line object.
有没有办法让这项工作?
答案 0 :(得分:1)
似乎错误是由ifelse
if
产生的。我从那里接受的答案尝试了解决方法,但这没有帮助。所以我想最简单的方法是切换到常规style.if = function (grid.vertical = T) {
t <- theme()
if (grid.vertical)
t <- t + theme(panel.grid.major.x = element_line(colour = 'red'))
else t <- t + theme(panel.grid.major.x = element_blank())
t
}
ggplot(mtcars, aes(x=wt, y=mpg)) + geom_line() + style.if()
ggplot(mtcars, aes(x=wt, y=mpg)) + geom_line() + style.if(F)
,虽然代码似乎不是特别整洁。
{{1}}
答案 1 :(得分:1)
这与ggplot代码检查类型的方式有关:
...
else if (!inherits(el, eldef$class) && !inherits(el, "element_blank")) {
stop("Element ", elname, " must be a ", eldef$class,
" object.")
}
由于我们正在使用ifelse函数,我认为这种动态类型检查voodoo会将ifelse视为此处的“元素”,因此条件永远不会满足,因为它不会从element_blank继承。要解决这个问题,只需使用常规的if / else表达式而不是ifelse:
style = function (grid.vertical = T) {
(theme_foundation() +
theme(
panel.grid.major.x = if(grid.vertical == T) element_line() else element_blank()
))}
我遇到了完全相同的问题,这个解决方案对我有用。