2014-10-29 53 views
1

我试图定义这个函数来轻松地将自定义主题设置为ggplot,但我在动态使用类似element_blank()这样的函数时遇到了问题。例如,指定是否将垂直网格线设置为TRUE/FALSE参数:如何在ggplot2中动态设置主题对象?

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. 

有没有一种方法,使这项工作?

回答

1

看来该错误是由ifelseunpleasant peculiarity产生的。我尝试了从那里接受的答案的解决方法,但没有帮助。所以我想最简单的方法是切换到正规的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

这有做如何ggplot代码检查类型:

... 
else if (!inherits(el, eldef$class) && !inherits(el, "element_blank")) { 
    stop("Element ", elname, " must be a ", eldef$class, 
     " object.") 
} 

由于我们使用的ifelse功能,我觉得这个动态类型检查巫术将着眼于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() 
))} 

我有完全相同的问题,该解决方案为我工作。