我正在使用ggplot在函数内写一堆图。我想将另一个标志传递给函数,以便我可以在调用函数时选择是否绘制线条或点。
目前我这样做:
plot2pdfHD = function(opdata, dir = 'plots'){
#... do something ...
plots <- list()
for (i in seq(strikes)){
#... do something ...
plots[[i]] <- ggplot(sset, aes(x = TIMESTAMP, y = value, col = optype)) +
geom_line() + labs(x = "Time", y = 'values') +
#... do something ...
}
pdf(paste0(dir, '/', Sys.Date(), '.pdf'), width=16, height=10)
for(i in seq(length(plots)))
tryCatch({print(plots[[i]])}, error = function(e) NULL)
dev.off()
}
我想添加一个标志,以便通过为标志设置适当的值,我可以在调用函数时在geom_line()
和geom_point()
之间切换。
另外:
是否可以在不重复其他通话部分的情况下完成,即#... do something ...
?我希望得到一个答案。
sset
也是opdata
的一部分。
答案 0 :(得分:5)
也许这就是你要找的东西?我喜欢@ arvi1000的答案---很好但很清楚 - 但你可以把if语句放在一个ggplot添加表达式中:
type = "line"
## also try with
# type = "point"
ggplot(mtcars, aes(x = wt, y = mpg)) + {
if(type == "point") geom_point() else geom_line()
} +
theme_bw()
对于多层,我会建议这样的事情:
gg = ggplot(mtcars, aes(x = wt, y = mpg))
{if(type == "point") {
gg + geom_point()
} else {
gg + geom_line() + stat_smooth()
}} + theme_bw()
(当然,将theme_bw()
添加到原始gg
定义会更干净,但这表明可以稍后添加。)
答案 1 :(得分:1)
普通的旧if
阻止?
plot2pdfHD = function(opdata, dir = 'plots', plot_type){
plots <- list()
for (i in seq(strikes)) {
# base gg call
p <- ggplot(sset, aes(x = TIMESTAMP, y = value, col = optype))
# add geom layer based on content of argument:
if(plot_type == 'line') p <- p + geom_line()
if(plot_type == 'point') p <- p + geom_point()
# add additional params and assign into list item
plots[[i]] <- p + labs(x = "Time", y = 'values')
#...
}
# ...
}
其他说明:
sset
不同的事情,否则你将得到一份相同的情节列表lapply
可能比这里的for
循环更好,特别是因为你想要一个列表对象作为结果